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 {}