-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvm-start.sh
executable file
·243 lines (223 loc) · 7.37 KB
/
vm-start.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
#!/bin/bash
#############################################################################
# Create By: zhf_sy
# License: GNU GPLv3
# Test On: CentOS 7
#############################################################################
# sh
SH_NAME=${0##*/}
SH_PATH=$( cd "$( dirname "$0" )" && pwd )
cd ${SH_PATH}
# 引入env
#. ${SH_PATH}/kvm.env
# 本地env
VM_LIST="${SH_PATH}/my_vm.list"
F_HELP()
{
echo "
用途:启动虚拟机;设置虚拟机自动启动
依赖:
注意:本脚本在centos 7上测试通过
用法:
$0 [-h|--help]
$0 [-l|--list]
$0 [ <-s|--start> <-a|--autostart> ] [ [-f|--file {清单文件}] | [-S|--select] | [-A|--ARG {虚拟机1} {虚拟机2} ... {虚拟机n}] ]
参数说明:
\$0 : 代表脚本本身
[] : 代表是必选项
<> : 代表是可选项
| : 代表左右选其一
{} : 代表参数值,请替换为具体参数值
% : 代表通配符,非精确值,可以被包含
#
-h|--help 此帮助
-l|--list 列出KVM上的虚拟机
-s|--start 启动虚拟机
-a|--autostart 开启自动启动虚拟机
-f|--file 从文件选择虚拟机(默认),默认文件为【./my_vm.list】,请基于【my_vm.list.sample】创建
-S|--select 从KVM中选择虚拟机
-A|--ARG 从参数获取虚拟机
示例:
#
$0 -h #--- 帮助
$0 -l #--- 列出KVM上的虚拟机
# 一般(默认从默认文件)
$0 -s #--- 启动默认虚拟机清单文件【./my_vm.list】中的虚拟机
$0 -s -a #--- 启动默认虚拟机清单文件【./my_vm.list】中的虚拟机,并设置为自动启动
$0 -a #--- 自动启动默认虚拟机清单文件【./my_vm.list】中的虚拟机
# 从指定文件
$0 -s -f xxx.list #--- 启动虚拟机清单文件【xxx.list】中的虚拟机
$0 -a -f xxx.list #--- 自动启动虚拟机清单文件【xxx.list】中的虚拟机
# 我选择
$0 -s -S #--- 启动我选择的虚拟机
$0 -a -S #--- 自动启动我选择的虚拟机
# 指定虚拟机
$0 -s -A vm1 vm2 #--- 启动虚拟机【vm1、vm2】
$0 -a -A vm1 vm2 #--- 自动启动虚拟机【vm1、vm2】
"
}
# 用法:F_VM_SEARCH 虚拟机名
F_VM_SEARCH ()
{
FS_VM_NAME=$1
GET_IT='NO'
while read LINE
do
F_VM_NAME=`echo "$LINE" | awk '{print $2}'`
F_VM_STATUS=`echo "$LINE" | awk '{print $3}'`
if [ "x${FS_VM_NAME}" = "x${F_VM_NAME}" ]; then
GET_IT='YES'
break
fi
done < ${VM_LIST_ONLINE}
#
if [ "${GET_IT}" = 'YES' ]; then
echo -e "${F_VM_STATUS}"
return 0
else
return 1
fi
}
# 参数检查
TEMP=`getopt -o hlsaf:SA -l help,list,start,autostart,file:,select,ARG -- "$@"`
if [ $? != 0 ]; then
echo -e "\n峰哥说:参数不合法,请查看帮助【$0 --help】\n"
exit 1
fi
#
eval set -- "${TEMP}"
# 现有vm
VM_LIST_ONLINE="/tmp/${SH_NAME}-vm.list.online"
virsh list --all | sed '1,2d;s/[ ]*//;/^$/d' > ${VM_LIST_ONLINE}
VM_START='no'
VM_AUTOSTART='no'
VM_LIST_FROM='file'
while true
do
case "$1" in
-h|--help)
F_HELP
exit
;;
-l|--list)
echo "KVM虚拟机清单:"
#echo "---------------------------------------------"
#awk '{printf "%3s : %-40s %s %s\n", NR, $2,$3,$4}' ${VM_LIST_ONLINE}
#echo "---------------------------------------------"
awk '{printf "%s,%s %s\n", $2,$3,$4}' ${VM_LIST_ONLINE} > /tmp/vm.list
${SH_PATH}/format_table.sh -d ',' -t 'NAME,STATUS' -f /tmp/vm.list
exit
;;
-s|--start)
VM_START='yes'
shift
;;
-a|--autostart)
VM_AUTOSTART='yes'
shift
;;
-f|--file)
VM_LIST_FROM='file'
VM_LIST=$2
shift 2
if [ ! -f "${VM_LIST}" ]; then
echo -e "\n峰哥说:文件【${VM_LIST}】不存在,请检查!\n"
exit 1
fi
;;
-S|--select)
VM_LIST_FROM='select'
shift
;;
-A|--ARG)
VM_LIST_FROM='arg'
shift
;;
--)
shift
break
;;
*)
echo -e "\n峰哥说:未知参数,请查看帮助【$0 --help】\n"
exit 1
;;
esac
done
case "${VM_LIST_FROM}" in
arg)
ARG_NUM=$#
if [ ${ARG_NUM} -eq 0 ]; then
echo -e "\n峰哥说:缺少参数,请查看帮助!\n"
exit 2
fi
for ((i=1;i<=ARG_NUM;i++))
do
VM_NAME=$1
shift
# 匹配?
if [ `F_VM_SEARCH "${VM_NAME}" > /dev/null; echo $?` -ne 0 ]; then
echo -e "\n峰哥说:虚拟机【${VM_NAME}】没找到,跳过!\n"
continue
fi
#
if [ "${VM_START}" = 'yes' ]; then
virsh start ${VM_NAME}
fi
if [ "${VM_AUTOSTART}" = 'yes' ]; then
virsh autostart ${VM_NAME}
fi
done
;;
file)
#
VM_LIST_TMP="${VM_LIST}.tmp"
sed -e '/^#/d' -e '/^$/d' -e '/^[ ]*$/d' ${VM_LIST} > ${VM_LIST_TMP}
while read LINE
do
VM_NAME=`echo $LINE | cut -f 2 -d '|'`
VM_NAME=`echo $VM_NAME`
# 匹配?
if [ `F_VM_SEARCH "${VM_NAME}" > /dev/null; echo $?` -ne 0 ]; then
echo -e "\n峰哥说:虚拟机【${VM_NAME}】没找到,跳过!\n"
continue
fi
#
if [ "${VM_START}" = 'yes' ]; then
virsh start ${VM_NAME}
fi
if [ "${VM_AUTOSTART}" = 'yes' ]; then
virsh autostart ${VM_NAME}
fi
done < ${VM_LIST_TMP}
;;
select)
echo "虚拟机清单:"
echo "---------------------------------------------"
awk '{printf "%c : %-40s %s %s\n", NR+96, $2,$3,$4}' ${VM_LIST_ONLINE}
echo "---------------------------------------------"
echo "请选择你想操作的虚拟机!"
read -p "请输入(可以联系输入多个,不能有空格,如:def):" ANSWER
echo "OK!"
echo "你选择的是:${ANSWER}"
read -p "按任意键继续......"
VM_SELECT_LIST=$(echo ${ANSWER})
VM_SELECT_NUM=$(echo ${#VM_SELECT_LIST})
#
for ((i=0;i<VM_SELECT_NUM;i++))
do
VM_SELECT_No=$(echo ${VM_SELECT_LIST:${i}:1})
VM_NAME=$(awk '{printf "%c : %-40s %s%s\n", NR+96, $2,$3,$4}' ${VM_LIST_ONLINE} | awk '/'^${VM_SELECT_No}'/{print $3}')
#
if [ "${VM_START}" = 'yes' ]; then
virsh start ${VM_NAME}
fi
if [ "${VM_AUTOSTART}" = 'yes' ]; then
virsh autostart ${VM_NAME}
fi
done
;;
*)
echo "参数错误,你私自修改脚本了"
exit 1
;;
esac