OpenStack 环境下 shell 编程练习(持续更新中)

须知:

1、本次 Shell 主要是针对于 OpneStack 环境下的编程练习

2、欢迎大家留言讨论

3、持续更新

 

练习1:将文件内容打印输出到屏幕上,并在每一行前面加上字符串“nova delete ”,示例如下:

文件内容为:

aaaa

bbbb

cccc

屏幕上输出为:

nova delete aaaa

nova delete bbbb

nova delete cccc

#!/bin/bash
#文件功能:文件内容打印输出到屏幕上,并在每一行前面加上字符串“nova delete ”
WORK_PATH="/root/gsd/shell"
function method1()
{
for i in `cat $WORK_PATH/file1`
do
  echo "nova delete "$i
done
}
function method2()
{
 sed   's/^/nova delete /g' $WORK_PATH/file1 
}
method2

练习2:创建一台虚拟机,并将此虚拟机的id、所在物理机、创建时间输出到文件里

#!/bin/bash
#文件功能:创建一台虚拟机,并将此虚拟机的id、所在物理机、创建时间输出到文件result里
#添加功能,检查云主机是否状态可用
WORK_PATH="/root/gsd/shell"
#声明环境变量
source /root/.admin-openrc.sh 
#判断日志文件是否存在
LOG_FILE=$WORK_PATH/instance.log
if [ ! -f $LOG_FILE ];then
touch $LOG_FILE
printf "%-40s%-15s%-25s%-10s%s\n" "UUID" "NAME" "CREATE_TIME" "NODE" "VNC" > $LOG_FILE
fi
LOG_FILE=$WORK_PATH/error.log
if [ ! -f $LOG_FILE ];then
touch $LOG_FILE
fi
exec 2>>$LOG_FILE
#虚拟机类型
FLAVOR=4C8G
#子网ID
NET_ID=141247b7-30cc-49ca-a485-578ce3d4ece2
#镜像ID
IMG_ID=e7348615-8de4-49e6-8466-794ed4572df4
#磁盘类型
SOURCE=image
#存储位置
DEST=volume
#存储大小
VOLUME_SIZE=20
#虚拟机名称
NAME=gsd-vm7
UUID=
CREATE_TIME=
NODE=
NOVNC=
VM_STATUS=""
create()
{
UUID=`nova boot --flavor $FLAVOR --nic net-id=$NET_ID --block-device source=$SOURCE,id=$IMG_ID,dest=$DEST,size=$VOLUME_SIZE,shutdown=preserve,bootindex=0 $NAME --admin-pass "passw0rd"|gr
ep -w 'id'|awk '{print $4}'`
if [ $? -ne 0 ]; then
echo "the instance create fail"
exit
else
echo "the instance create success"
fi
}
info()
{
CREATE_TIME=`nova show $UUID|grep -w "created"|awk '{print $4}'`
NODE=`nova show $UUID|grep -w "OS-EXT-SRV-ATTR:host"|awk '{print $4}'`
NOVNC=`nova get-vnc-console $UUID novnc |grep 'http'|awk '{print $4}'`
VM_STATUS=`nova show $UUID||grep -w 'status'|awk '{print $4}'`
printf "%-40s%-15s%-25s%-10s%s\n" "$UUID" "$NAME" "$CREATE_TIME" "$NODE" "$NOVNC" >> $LOG_FILE
}
check(){
count=0
VM_STATUS=`nova show $UUID|grep -w 'status'|awk '{print $4}'`
echo "vm is "$VM_STATUS
while [[ "$VM_STATUS" != "ACTIVE" ]]
do
let count++
sleep 10s
echo "Please wait"
if [ $count -ge 30 ];then
echo 'Is time out'
return 1
fi
VM_STATUS=`nova show $UUID|grep -w 'status'|awk '{print $4}'`
echo "vm is "$VM_STATUS
done
echo "The vm is available!"
}
create
check
info
echo "DONE"

 

 练习3:找到所有error的虚拟机,并对虚拟机执行删除操作

#!/bin/bash
#文件名称:找到所有error的虚拟机,并对虚拟机执行删除操作
WORK_PATH="/root/gsd/shell"
#声明环境变量
source /root/.admin-openrc.sh
LOG_FILE=$WORK_PATH/error.log
if [ ! -f $LOG_FILE ];then
  touch $LOG_FILE
fi
exec  2>>$LOG_FILE
time=$(date +%Y-%m-%d--%H:%M)
error=1
for i in $(nova list --all |grep ERROR|awk '{print $2}')
do
  error=0
  #nova delete $i 1>/dev/null
  echo "shida"
  if [ $? -eq 0 ];then
    echo "$i delete done"
  else
    echo "$i delete fail"
    printf $time >> $LOG_FILE
  fi
done
if [ $error == 1 ];then
  echo "no error vm"
fi

 练习4:在控制节点上执行脚本,可以查出某个虚拟机的宿主机以及在宿主机上的vnc端口号

#!/bin/bash
#文件名称:在控制节点上执行脚本,可以查出某个虚拟机的宿主机以及在宿主机上的vnc端口号
WORK_PATH="/root/gsd/shell"
#声明环境变量
source /root/.admin-openrc.sh
LOG_FILE=$WORK_PATH/error.log
if [ ! -f $LOG_FILE ];then
  touch $LOG_FILE
fi
exec  2>>$LOG_FILE
time=$(date +%Y-%m-%d--%H:%M)
printf  "Enter the vm's UUID:"
read UUID
nova show $UUID > /dev/null
if [ $? -eq 0 ];then
  echo "wait...."
  NODE=`nova show $UUID|grep -w "OS-EXT-SRV-ATTR:host"|awk '{print $4}'`
  INSTANCE=`nova show $UUID|grep -w "OS-EXT-SRV-ATTR:instance_name"|awk '{print $4}'`
  port=`sshpass -p '您的密码'  ssh  -o StrictHostKeyChecking=no root@$NODE "virsh vncdisplay $INSTANCE|cut -d: -f2"`
  echo "the vm's vnc port is "$port
else
  echo "no this  vm id or is error"
fi

  练习4:在控制节点上执行脚本,可以查出某个虚拟机的宿主机以及在宿主机上的vnc端口号

#!/bin/bash
#文件名称:在控制节点上执行脚本,可以查出某个虚拟机的宿主机以及在宿主机上的vnc端口号
WORK_PATH="/root/gsd/shell"
#声明环境变量
source /root/.admin-openrc.sh
LOG_FILE=$WORK_PATH/error.log
if [ ! -f $LOG_FILE ];then
  touch $LOG_FILE
fi
exec  2>>$LOG_FILE
time=$(date +%Y-%m-%d--%H:%M)
printf  "Enter the vm's UUID:"
read UUID
nova show $UUID > /dev/null
if [ $? -eq 0 ];then
  echo "wait...."
  NODE=`nova show $UUID|grep -w "OS-EXT-SRV-ATTR:host"|awk '{print $4}'`
  INSTANCE=`nova show $UUID|grep -w "OS-EXT-SRV-ATTR:instance_name"|awk '{print $4}'`
  port=`sshpass -p '密码'  ssh  -o StrictHostKeyChecking=no root@$NODE "virsh vncdisplay $INSTANCE|cut -d: -f2"`
  echo "the vm's vnc port is "$port
else
  echo "no this  vm id or is error"
fi

  练习5:连接数据库并查询出所有被删除的虚拟机id

#!/bin/bash
#文件名称:连接数据库并查询出所有被删除的虚拟机id
WORK_PATH="/root/gsd/shell"
#声明环境变量
source /root/.admin-openrc.sh
LOG_FILE=$WORK_PATH/error.log
if [ ! -f $LOG_FILE ];then
  touch $LOG_FILE
fi
exec  2>>$LOG_FILE
time=$(date +%Y-%m-%d--%H:%M)
HOSTNAME=172.28.229.47
MYSQL_USER=root
MYSQL_PASS=密码
echo "The was deleted vm's UUID:"
mysql -h $HOSTNAME -u$MYSQL_USER -p$MYSQL_PASS -e "select vm.uuid from nova.instances vm where vm.vm_state = 'deleted';"

练习8:有2个网络,在每个网络里创建10台虚拟机

#!/bin/bash
#文件名称:有2个网络,在每个网络里创建10台虚拟机
WORK_PATH="/root/gsd/shell"
#声明环境变量
source /root/.admin-openrc.sh
LOG_FILE=$WORK_PATH/error.log
if [ ! -f $LOG_FILE ];then
  touch $LOG_FILE
fi
#exec  2>>$LOG_FILE
#虚拟机类型
FLAVOR=4C8G
#子网ID
NET_ID=(141247b7-30cc-49ca-a485-578ce3d4ece2 967efbab-4ef5-4ee1-9d8a-18303778529f)
#镜像ID
IMG_ID=e7348615-8de4-49e6-8466-794ed4572df4
#磁盘类型
SOURCE=image
#存储位置
DEST=volume
#存储大小
VOLUME_SIZE=20
#虚拟机名称
NAME=('gsd-vm-1' 'gsd-vm-2')
UUID=
VOLUME_TYPE="Ceph"
for i in `seq 0 1`
do
  nova boot --flavor $FLAVOR --nic net-id=${NET_ID[$i]}  --block-device source=$SOURCE,id=$IMG_ID,dest=$DEST,size=$VOLUME_SIZE,shutdown=preserve,bootindex=0 ${NAME[$i]} --admin-pass "passw
0rd" --max-count 2
done

练习9:列出所有disable节点上的虚拟机

#!/bin/bash
#文件名称:列出所有disable节点上的虚拟机
WORK_PATH="/root/gsd/shell"
#声明环境变量
source /root/.admin-openrc.sh
LOG_FILE=$WORK_PATH/error.log
if [ ! -f $LOG_FILE ];then
  touch $LOG_FILE
fi
#exec  2>>$LOG_FILE
for i in `nova service-list|grep disabled|awk '{print $6}'`
do
 echo "The vm $i 's Status is  disabled:"
 sshpass -p 'passw0rd'  ssh  -o StrictHostKeyChecking=no root@$i "virsh list --all --uuid"
done 

练习10:一共创建6台虚拟机,每2台使用一个网络,每创建2台就sleep 5秒

#!/bin/bash
#文件名称:一共创建6台虚拟机,每2台使用一个网络,每创建2台就sleep 5秒
WORK_PATH="/root/gsd/shell"
#声明环境变量
source /root/.admin-openrc.sh
LOG_FILE=$WORK_PATH/error.log
if [ ! -f $LOG_FILE ];then
  touch $LOG_FILE
fi
exec  2>>$LOG_FILE
FLAVOR=4C8G
#镜像ID
IMG_ID=e7348615-8de4-49e6-8466-794ed4572df4
#磁盘类型
SOURCE=image
#存储位置
DEST=volume
#存储大小
VOLUME_SIZE=20
UUID=
CREATE_TIME=
NODE=
NOVNC=
VM_STATUS=""
VOLUME_TYPE="Ceph"
VOLUME_SIZE=20
NET_NUM=2
VM_NUM=6
count=1
sleep_num=1
for i in {1..3}
do 
  net_id=`neutron net-create gsdnet-$i|grep -w id|awk '{print $4}'`
  name="subnett"-$i
  message=`neutron subnet-create gsdnet-$i 100.0.$i.0/24 --name $name` 
  for j in $(seq 1 2)
  do
    vm_name="gsd-vm-$count"
    echo $vm_name
    UUID=`nova boot --flavor $FLAVOR --nic net-id=$net_id --block-device source=$SOURCE,id=$IMG_ID,dest=$DEST,volumetype=$VOLUME_TYPE,size=$VOLUME_SIZE,shutdown=preserve,bootindex=0 $vm_na
me --admin-pass "passw0rd"|grep -w 'id'|awk '{print $4}'`
    echo $UUID----------------------$net_id
    let count++
    if [ $sleep_num -eq 2 ];then
      echo "zzzz" 
      sleep_num=0
    fi
    let sleep_num++
  done
done

练习11:查询计算节点是disable的节点上的所有虚拟机,并打印这些虚拟机的配置(cpu,内存,系统盘大小,数据盘大小)

#!/bin/bash
#文件名称:查询计算节点是disable的节点上的所有虚拟机,并打印这些虚拟机的配置(cpu,内存,系统盘大小,数据盘大小)
WORK_PATH="/root/gsd/shell"
#声明环境变量
source /root/.admin-openrc.sh
LOG_FILE=$WORK_PATH/error.log
if [ ! -f $LOG_FILE ];then
  touch $LOG_FILE
fi
#exec  2>>$LOG_FILE
for i in `nova service-list|grep disabled|awk '{print $6}'`
do
 echo "The vm $i 's Status is  disabled:"sshpass -p '密码'  ssh  -o StrictHostKeyChecking=no root@$i "echo "shida";echo $i;lscpu|grep -w '^CPU(s)';free -h|head -n 2;df -h |head -n 2"done 

练习12:查询一个虚拟机的port信息的详细信息

#!/bin/bash
#文件名称:查询一个虚拟机的port信息的详细信息
WORK_PATH="/root/gsd/shell"
#声明环境变量
source /root/.admin-openrc.sh
LOG_FILE=$WORK_PATH/error.log
if [ ! -f $LOG_FILE ];then
  touch $LOG_FILE
fi
exec  2>>$LOG_FILE
UUID=e872d450-d6df-47d3-94bf-188ab2ae68d5
TENANT_ID=`nova show e872d450-d6df-47d3-94bf-188ab2ae68d5|grep tenant_id|awk '{print $4}'`
IP=`nova show e872d450-d6df-47d3-94bf-188ab2ae68d5|grep default_network|awk '{print $5}'`
neutron port-list |grep $IP|grep $TENANT_ID|awk '{print $2}'|xargs -i neutron port-show {}
posted @ 2018-10-14 13:50  观青山  阅读(701)  评论(0编辑  收藏  举报