背景:批量操作虚机,虚机的名称都有一样的前缀比如2019-robot-*,先通过nova list找到每个虚机id,然后通过虚机id进行批量删除虚机。
找到虚机id并批量删除虚机
虚机id的查询结果
# nova list --all-tenants | grep 2019-robot-
| ID | Name | Status | Task State | Power State | Networks |
| 957b3fd5 | 2019-robot-01 | ACTIVE | None | Running | net=10.10.0.4 |
| 967b3fh9 | 2019-robot-aa | ACTIVE | None | Running | net=10.10.0.5 |
| 96asdfh5 | 2019-robot-cc | ACTIVE | None | Running | net=10.10.0.6 |
步骤1:awk取虚机ID
# nova list --all-tenants | grep 2019-robot- | awk -F ' ' '{print $2}'
957b3fd5
967b3fh9
96asdfh5
# nova list --all-tenants | grep 2019-robot- | awk -F ' ' '{print $2}' > /root/2019-robot-vm-hang.txt
#2019-robot-vmid_array=`cat /root/2019-robot-vm-hang.txt`
## 另外一种方法(可以跳过去):在上边的基础上使用xargs,xargs把虚机ID换行然后放到文件中,赋值环境变量(即放到数组)
# nova list --all-tenants | grep 2019-robot- | awk -F ' ' '{print $2}' | xargs
957b3fd5 967b3fh9 96asdfh5
# nova list --all-tenants | grep 2019-robot- | awk -F ' ' '{print $2}' | xargs >> /root/2019-robot-vm.txt
## 不知道为啥不能直接这样执行?非要放到一个文件中然后再cat后赋值。 2019-robot-vmid_array=`nova list --all-tenants | grep 2019-robot- | awk -F ' ' '{print $2}' | xargs `
#2019-robot-vmid_array=`cat /root/2019-robot-vm.txt`
步骤2:for循环批量删除虚机
## 一行搞定 for 循环单独执行比较方便
# for vmid in $2019-robot-vmid_array; do nova delete $vmid; done
## shell脚本 for 循环,方便阅读
for vmid in $2019-robot-vmid_array
do
nova delete $vmid
done
## do有多个操作,记录删除时间和查询是否删除
# for vmid in $2019-robot-vmid_array; do nova delete $vmid; date ; nova list --all-tenant | grep $vmid; done
步骤2另外一种方法:while和read实现批量删除虚机
# while read vmid; do nova delete $vmid; date ; nova list --all-tenant | grep $vmid; done < /root/2019-robot-vm-hang.txt
框架思考--产出通用的工具
从上边的两步操作步骤是别有用心的,在使用过程中不断磨合的,批量操作有很多种类型比如硬重启虚机/软重启虚机/迁移虚机/stop关机/pause暂挂虚机/unpause解挂虚机等,但是虚机的id也就是批量操作所依赖的数据是不变的,意味着正常情况下第1步没必要重复操作,当满足要求的虚机id是动态变化的,那么第1步和第2步也可以同时执行,以上是拆分为两步的原因。
第1步是获取批量操作所依赖的某些数据,根据实际情况看是否需要,当然也可以手工构造数据,比如主机的ip列表;
第2步是执行批量操作,有两个参数:第1步的数据和批量操作的命令。
# ./batch-tool.sh "ip-list.txt" "ping -c 2 $ip"
网友评论