工具介紹:
建立虛拟機會使用多線程隊列的方式去控制同時建立的虛拟機數量
如果在建立的虛拟機比較多,會2次建立。第一次會在各個主控端上建立一台,其餘的會再第一次建立成功後建立。
因為第一次建立需要傳輸鏡像會比較慢,在主控端上已經有對應的鏡像後,再次建立相同鏡像的虛拟機,不再需要傳輸相應的鏡像(所有相同鏡像的虛拟機共用同一個後端鏡像,openstack對鏡像管理使用copy on write技術)
查詢和更改主要都是通過查詢資料庫實作。
其它功能自測。
<a></a>
<a href="http://redmine.uuzu.com/projects/ops-sys/wiki/%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%88%9B%E5%BB%BA%E8%84%9A%E6%9C%AC%EF%BC%9Aopenstack_managerpy_%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/edit?section=9" target="_blank"></a>
(建立過程中某個虛拟機出錯,可以進行檢視建立虛拟機指令進行手動建立)
-f 指定檔案的檔案格式:
批量ping是檢查ip虛拟機是否存在,指定的檔案也是參照此格式
nodename instance_ip flavor
一行一個虛拟機
其它使用資訊:
腳本中的flavor對應的flavor id,項目帳号密碼和鏡像ID,資料庫帳号等替換成自己生産環境中的資訊
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
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
<code>#!/usr/bin/python</code>
<code>#coding:utf8</code>
<code>#Auth by lust</code>
<code>import</code> <code>sys,commands,os,MySQLdb</code>
<code>import</code> <code>Queue, threading,time</code>
<code>from</code> <code>fabric.colors </code><code>import</code> <code>*</code>
<code>from</code> <code>optparse </code><code>import</code> <code>OptionParser</code>
<code>class</code> <code>vmListAnaly():</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>,vmlist_file):</code>
<code> </code><code>self</code><code>.f_handle </code><code>=</code> <code>open</code><code>(vmlist_file)</code>
<code> </code><code>self</code><code>.vmlist </code><code>=</code> <code>{}</code>
<code> </code><code>while</code> <code>True</code><code>:</code>
<code> </code><code>self</code><code>.file_tmp </code><code>=</code> <code>self</code><code>.f_handle.readline()</code>
<code> </code><code>if</code> <code>self</code><code>.file_tmp:</code>
<code> </code><code>if</code> <code>self</code><code>.vmlist.has_key(</code><code>self</code><code>.file_tmp.split()[</code><code>0</code><code>]): </code>
<code> </code><code>self</code><code>.vmlist[</code><code>self</code><code>.file_tmp.split()[</code><code>0</code><code>]].append((</code><code>self</code><code>.file_tmp.split()[</code><code>1</code><code>],</code><code>self</code><code>.file_tmp.split()[</code><code>2</code><code>]))</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>self</code><code>.vmlist[</code><code>self</code><code>.file_tmp.split()[</code><code>0</code><code>]] </code><code>=</code> <code>[]</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>break</code>
<code> </code><code>def</code> <code>getAllIps(</code><code>self</code><code>):</code>
<code> </code><code>ips </code><code>=</code> <code>[]</code>
<code> </code><code>for</code> <code>__host </code><code>in</code> <code>self</code><code>.vmlist:</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>self</code><code>.vmlist[__host]:</code>
<code> </code><code>ips.append(i[</code><code>0</code><code>])</code>
<code> </code><code>return</code> <code>ips</code>
<code> </code><code>def</code> <code>getFirstIps(</code><code>self</code><code>):</code>
<code> </code><code>ips.append(</code><code>self</code><code>.vmlist[__host][</code><code>0</code><code>][</code><code>0</code><code>])</code>
<code> </code><code>def</code> <code>getSecondIps(</code><code>self</code><code>):</code>
<code> </code><code>del</code> <code>self</code><code>.vmlist[__host][</code><code>0</code><code>]</code>
<code> </code><code>def</code> <code>getAllCreInfo(</code><code>self</code><code>):</code>
<code> </code><code>return</code> <code>self</code><code>.vmlist</code>
<code> </code><code>def</code> <code>getFirstCreInfo(</code><code>self</code><code>):</code>
<code> </code><code>results </code><code>=</code> <code>[]</code>
<code> </code><code>self</code><code>.vmlist[__host] </code><code>=</code> <code>[</code><code>self</code><code>.vmlist[__host][</code><code>0</code><code>]]</code>
<code> </code><code>def</code> <code>getSecondCreInfo(</code><code>self</code><code>):</code>
<code> </code><code>def</code> <code>__del__(</code><code>self</code><code>):</code>
<code> </code><code>self</code><code>.f_handle.close()</code>
<code>class</code> <code>getCmd():</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>,project,vminfo,flavor,mysql_host,mysql_user,mysql_passwd):</code>
<code> </code><code>self</code><code>.mysql_user </code><code>=</code> <code>mysql_user</code>
<code> </code><code>self</code><code>.mysql_host </code><code>=</code> <code>mysql_host</code>
<code> </code><code>self</code><code>.mysql_passwd </code><code>=</code> <code>mysql_passwd</code>
<code> </code><code>self</code><code>.project </code><code>=</code> <code>project</code>
<code> </code><code>self</code><code>.vminfo </code><code>=</code> <code>vminfo</code>
<code> </code><code>self</code><code>.flavor </code><code>=</code> <code>flavor</code>
<code> </code><code>self</code><code>.create_cmd </code><code>=</code> <code>[]</code>
<code> </code><code>def</code> <code>get_cmd(</code><code>self</code><code>):</code>
<code> </code><code>quantum_obj </code><code>=</code> <code>mysqlEng(host</code><code>=</code><code>self</code><code>.mysql_host,user</code><code>=</code><code>self</code><code>.mysql_user,passwd</code><code>=</code><code>self</code><code>.mysql_passwd)</code>
<code> </code><code>for</code> <code>__host </code><code>in</code> <code>self</code><code>.vminfo:</code>
<code> </code><code>if</code> <code>self</code><code>.vminfo[__host]:</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>self</code><code>.vminfo[__host]:</code>
<code> </code><code>__ip </code><code>=</code> <code>i[</code><code>0</code><code>]</code>
<code> </code><code>__flavor </code><code>=</code> <code>i[</code><code>1</code><code>]</code>
<code> </code><code>__network_id </code><code>=</code> <code>quantum_obj.getNetworkID(__ip)</code>
<code> </code><code>__tmp </code><code>=</code> <code>"nova --os-username %s --os-password %s --os-tenant-name %s boot --security-groups %s --flavor %s --image %s --nic net-id=%s,v4-fixed-ip=%s --meta lan=%s --availability-zone nova:%s %s"</code> <code>%</code> <code>(</code><code>self</code><code>.project[</code><code>'OS_USERNAME'</code><code>],</code><code>self</code><code>.project[</code><code>'OS_PASSWORD'</code><code>],</code><code>self</code><code>.project[</code><code>'OS_TENANT_NAME'</code><code>],</code><code>self</code><code>.project[</code><code>'SECURITY_GROUPS'</code><code>],flavor[__flavor],</code><code>self</code><code>.project[</code><code>'IMAGE_ID'</code><code>],__network_id,__ip,__ip,__host,__ip)</code>
<code> </code><code>self</code><code>.create_cmd.append(__tmp)</code>
<code> </code><code>return</code> <code>self</code><code>.create_cmd</code>
<code>class</code> <code>mysqlEng():</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>,host</code><code>=</code><code>'127.0.0.1'</code><code>,user</code><code>=</code><code>'root'</code><code>,passwd</code><code>=</code><code>'</code><code>',port='</code><code>3306</code><code>'):</code>
<code> </code><code>self</code><code>.conn </code><code>=</code> <code>MySQLdb.connect(host</code><code>=</code><code>host,user</code><code>=</code><code>user,passwd</code><code>=</code><code>passwd,port</code><code>=</code><code>3306</code><code>)</code>
<code> </code><code>self</code><code>.cur </code><code>=</code> <code>self</code><code>.conn.cursor()</code>
<code> </code><code>def</code> <code>getNetworkID(</code><code>self</code><code>,ip):</code>
<code> </code><code>self</code><code>.conn.select_db(</code><code>'quantum'</code><code>)</code>
<code> </code><code>net </code><code>=</code> <code>"%s.%s.%s.0/24"</code><code>%</code><code>(ip.split(</code><code>'.'</code><code>)[</code><code>0</code><code>],ip.split(</code><code>'.'</code><code>)[</code><code>1</code><code>],ip.split(</code><code>'.'</code><code>)[</code><code>2</code><code>])</code>
<code> </code><code>__sql </code><code>=</code> <code>"select network_id from subnets where name='%s'"</code> <code>%</code> <code>net</code>
<code> </code><code>self</code><code>.cur.execute(__sql)</code>
<code> </code><code>ret </code><code>=</code> <code>self</code><code>.cur.fetchall()</code>
<code> </code><code>return</code> <code>ret[</code><code>0</code><code>][</code><code>0</code><code>]</code>
<code> </code><code>def</code> <code>getVmstate(</code><code>self</code><code>,ip):</code>
<code> </code><code>self</code><code>.conn.select_db(</code><code>'nova'</code><code>)</code>
<code> </code><code>__sql </code><code>=</code> <code>"select instances.uuid,instance_metadata.value,instances.host,instances.vm_state from instance_metadata,instances where instances.uuid = instance_metadata.instance_uuid and instance_metadata.value = %s and instances.vm_state not in ('error','deleted');"</code>
<code> </code><code>self</code><code>.cur.execute(__sql,ip)</code>
<code> </code><code>return</code> <code>ret[</code><code>0</code><code>][</code><code>3</code><code>]</code>
<code> </code><code>def</code> <code>getActNum(</code><code>self</code><code>,ips):</code>
<code> </code><code>__sql </code><code>=</code> <code>"select count(*) from instance_metadata,instances where instances.uuid = instance_metadata.instance_uuid and instance_metadata.value in ('%s') and instances.vm_state = 'active';"</code> <code>%</code> <code>"','"</code><code>.join(ips)</code>
<code> </code><code>def</code> <code>updateInstanceFlavor(</code><code>self</code><code>,ip,flavor):</code>
<code> </code><code>__get_flavor_info_sql</code><code>=</code><code>"select id,memory_mb,vcpus from instance_types where flavorid = '%s' and deleted = 0;"</code> <code>%</code> <code>flavor</code>
<code> </code><code>self</code><code>.cur.execute(__get_flavor_info_sql)</code>
<code> </code><code>__flavor_info </code><code>=</code> <code>self</code><code>.cur.fetchall()</code>
<code> </code><code>__flavor_id </code><code>=</code> <code>__flavor_info[</code><code>0</code><code>][</code><code>0</code><code>]</code>
<code> </code><code>__mem </code><code>=</code> <code>__flavor_info[</code><code>0</code><code>][</code><code>1</code><code>]</code>
<code> </code><code>__vcpus </code><code>=</code> <code>__flavor_info[</code><code>0</code><code>][</code><code>2</code><code>]</code>
<code> </code><code>__update_flavor_info_sql</code><code>=</code><code>"update instances set instance_type_id='%d',vcpus='%d',memory_mb='%d' where hostname='%s' AND vm_state != 'deleted' AND vm_state != 'error';"</code> <code>%</code> <code>(__flavor_id,__vcpus,__mem,ip)</code>
<code> </code><code>self</code><code>.cur.execute(__update_flavor_info_sql)</code>
<code> </code><code>self</code><code>.conn.commit()</code>
<code> </code><code>def</code> <code>getInstanceFlavor(</code><code>self</code><code>,ip):</code>
<code> </code><code>__get_instance_flavor_sql </code><code>=</code> <code>"select vcpus,memory_mb from instances where hostname='%s' AND vm_state != 'deleted' AND vm_state != 'error';"</code> <code>%</code> <code>ip</code>
<code> </code><code>self</code><code>.cur.execute(__get_instance_flavor_sql)</code>
<code> </code><code>results </code><code>=</code> <code>(ip,ret[</code><code>0</code><code>][</code><code>0</code><code>],ret[</code><code>0</code><code>][</code><code>1</code><code>])</code>
<code> </code><code>return</code> <code>results</code>
<code> </code><code>def</code> <code>getInstanceInfo(</code><code>self</code><code>,ips):</code>
<code> </code><code>__get_instance_info_sql </code><code>=</code> <code>"select instances.uuid,instance_metadata.value,instances.host,instances.vm_state,memory_mb from instance_metadata,instances where instances.uuid = instance_metadata.instance_uuid and instance_metadata.value in ('%s') and instances.vm_state !='error' and instances.vm_state != 'deleted';"</code> <code>%</code> <code>"','"</code><code>.join(ips)</code>
<code> </code><code>self</code><code>.cur.execute(__get_instance_info_sql)</code>
<code> </code><code>return</code> <code>ret</code>
<code> </code><code>def</code> <code>getNodeInfo(</code><code>self</code><code>,nodes):</code>
<code> </code><code>__get_node_info_sql </code><code>=</code> <code>"select instances.uuid,instance_metadata.value,instances.host,instances.vm_state,memory_mb from instance_metadata,instances where instances.uuid = instance_metadata.instance_uuid and instances.host in ('%s') and instances.vm_state !='error' and instances.vm_state != 'deleted';"</code> <code>%</code> <code>"','"</code><code>.join(nodes)</code>
<code> </code><code>self</code><code>.cur.execute(__get_node_info_sql)</code>
<code> </code><code>self</code><code>.cur.close()</code>
<code> </code><code>self</code><code>.conn.close()</code>
<code>class</code> <code>checkIps():</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>):</code>
<code> </code><code>self</code><code>.ping_queue </code><code>=</code> <code>Queue.Queue()</code>
<code> </code><code>self</code><code>.up_ip </code><code>=</code> <code>[]</code>
<code> </code><code>self</code><code>.down_ip </code><code>=</code><code>[]</code>
<code> </code><code>def</code> <code>__check(</code><code>self</code><code>,q):</code>
<code> </code><code>while</code> <code>q.qsize():</code>
<code> </code><code>__ip </code><code>=</code> <code>q.get()</code>
<code> </code><code>__cmd </code><code>=</code> <code>"ping -c 2 %s"</code> <code>%</code> <code>__ip</code>
<code> </code><code>if</code> <code>commands.getstatusoutput(__cmd)[</code><code>0</code><code>] </code><code>=</code><code>=</code> <code>0</code><code>:</code>
<code> </code><code>self</code><code>.up_ip.append(__ip)</code>
<code> </code><code>self</code><code>.down_ip.append(__ip)</code>
<code> </code><code>q.task_done()</code>
<code> </code><code>def</code> <code>put2q(</code><code>self</code><code>,ips):</code>
<code> </code><code>for</code> <code>__ip </code><code>in</code> <code>ips:</code>
<code> </code><code>self</code><code>.ping_queue.put(__ip)</code>
<code> </code><code>def</code> <code>checking(</code><code>self</code><code>):</code>
<code> </code><code>print</code> <code>yellow(</code><code>'Checking ips ...'</code><code>)</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>xrange</code><code>(</code><code>100</code><code>):</code>
<code> </code><code>__pingd </code><code>=</code> <code>threading.Thread(target</code><code>=</code><code>self</code><code>.__check,args</code><code>=</code><code>(</code><code>self</code><code>.ping_queue))</code>
<code> </code><code>__pingd.setDaemon</code>
<code> </code><code>__pingd.start()</code>
<code> </code><code>self</code><code>.ping_queue.join()</code>
<code> </code><code>return</code> <code>{</code><code>'up'</code><code>:</code><code>self</code><code>.up_ip,</code><code>'down'</code><code>:</code><code>self</code><code>.down_ip}</code>
<code>class</code> <code>createVm():</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>,mysql_host,mysql_user,mysql_passwd):</code>
<code> </code><code>self</code><code>.create_queue </code><code>=</code> <code>Queue.Queue()</code>
<code> </code><code>self</code><code>.mysql_user </code><code>=</code> <code>mysql_user</code>
<code> </code><code>def</code> <code>__put2q(</code><code>self</code><code>,cmd_list,q):</code>
<code> </code><code>while</code> <code>len</code><code>(cmd_list) > </code><code>0</code><code>:</code>
<code> </code><code>while</code> <code>q.qsize() <</code><code>=</code> <code>3</code><code>:</code>
<code> </code><code>q.put(cmd_list.pop())</code>
<code> </code><code>time.sleep(</code><code>1</code><code>)</code>
<code> </code><code>if</code> <code>not</code> <code>cmd_list: </code><code>break</code>
<code> </code><code>time.sleep(</code><code>1</code><code>)</code>
<code> </code><code>def</code> <code>__create(</code><code>self</code><code>,q):</code>
<code> </code><code>time.sleep(</code><code>5</code><code>)</code>
<code> </code><code>while</code> <code>q.qsize() > </code><code>0</code><code>:</code>
<code> </code><code>__cmd </code><code>=</code> <code>q.get()</code>
<code> </code><code>__ip </code><code>=</code> <code>__cmd.split()[</code><code>-</code><code>1</code><code>]</code>
<code> </code><code>print</code> <code>"Building %s"</code><code>%</code> <code>__ip</code>
<code> </code><code>ret </code><code>=</code> <code>commands.getstatusoutput(__cmd)</code>
<code> </code><code>if</code> <code>ret[</code><code>0</code><code>] </code><code>=</code><code>=</code> <code>0</code><code>:</code>
<code> </code><code>time.sleep(</code><code>2</code><code>) </code>
<code> </code><code>__vm_state </code><code>=</code> <code>'building'</code>
<code> </code><code>while</code> <code>__vm_state !</code><code>=</code> <code>'active'</code><code>:</code>
<code> </code><code>time.sleep(</code><code>5</code><code>)</code>
<code> </code><code>__vm_state </code><code>=</code> <code>mysqlEng(host</code><code>=</code><code>self</code><code>.mysql_host,user</code><code>=</code><code>self</code><code>.mysql_user,passwd</code><code>=</code><code>self</code><code>.mysql_passwd).getVmstate(__ip)</code>
<code> </code><code>if</code> <code>__vm_state </code><code>=</code><code>=</code> <code>'error'</code><code>:</code>
<code> </code><code>self</code><code>.error_vms</code><code>+</code><code>=</code><code>1</code>
<code> </code><code>print</code> <code>red(</code><code>"虛拟機建立出錯,IP:%s"</code><code>) </code><code>%</code> <code>__ip</code>
<code> </code><code>break</code>
<code> </code><code>self</code><code>.ok_vms</code><code>+</code><code>=</code><code>1</code>
<code> </code><code>print</code> <code>green(</code><code>"%s 建立成功,此次建立虛拟機總數:%s , 成功的虛拟機:%s ,出錯的虛拟機:%s"</code><code>) </code><code>%</code> <code>(__ip,</code><code>self</code><code>.all_vms,</code><code>self</code><code>.ok_vms,</code><code>self</code><code>.error_vms)</code>
<code> </code><code>self</code><code>.error_vms</code><code>+</code><code>=</code><code>1</code>
<code> </code><code>print</code> <code>red(</code><code>"執行指令出錯,IP:%s,出錯資訊: %s \n"</code><code>)</code><code>%</code><code>(__ip,ret[</code><code>1</code><code>])</code>
<code> </code><code>def</code> <code>creating(</code><code>self</code><code>,cmds,ths):</code>
<code> </code><code>self</code><code>.all_vms </code><code>=</code> <code>len</code><code>(cmds)</code>
<code> </code><code>self</code><code>.ok_vms </code><code>=</code> <code>0</code>
<code> </code><code>self</code><code>.error_vms </code><code>=</code> <code>0</code>
<code> </code><code>__put_thread </code><code>=</code> <code>threading.Thread(target</code><code>=</code><code>self</code><code>.__put2q, args</code><code>=</code><code>(cmds,</code><code>self</code><code>.create_queue))</code>
<code> </code><code>__put_thread.setDaemon</code>
<code> </code><code>__put_thread.start()</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>xrange</code><code>(ths):</code>
<code> </code><code>__created </code><code>=</code> <code>threading.Thread(target</code><code>=</code><code>self</code><code>.__create, args</code><code>=</code><code>(</code><code>self</code><code>.create_queue,))</code>
<code> </code><code>__created.setDaemon</code>
<code> </code><code>__created.start()</code>
<code> </code><code>time.sleep(</code><code>10</code><code>)</code>
<code>class</code> <code>createAllvm():</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>,vmlist,flavor,mysql_host,mysql_user,mysql_passwd):</code>
<code> </code><code>self</code><code>.vmlist </code><code>=</code> <code>vmlist</code>
<code> </code><code>def</code> <code>start(</code><code>self</code><code>):</code>
<code> </code><code>create_obj </code><code>=</code> <code>createVm(mysql_host</code><code>=</code><code>self</code><code>.mysql_host,mysql_user</code><code>=</code><code>self</code><code>.mysql_user,mysql_passwd</code><code>=</code><code>self</code><code>.mysql_passwd)</code>
<code> </code>
<code> </code><code>first_create_cmd </code><code>=</code> <code>getCmd(project_info,vmListAnaly(</code><code>self</code><code>.vmlist).getFirstCreInfo(),</code><code>self</code><code>.flavor,mysql_host</code><code>=</code><code>self</code><code>.mysql_host,mysql_user</code><code>=</code><code>self</code><code>.mysql_user,mysql_passwd</code><code>=</code><code>self</code><code>.mysql_passwd).get_cmd()</code>
<code> </code><code>create_obj.creating(first_create_cmd,</code><code>2</code><code>)</code>
<code> </code><code>first_ips </code><code>=</code> <code>vmListAnaly(</code><code>'vmhost'</code><code>).getFirstIps()</code>
<code> </code><code>if</code> <code>mysqlEng(host</code><code>=</code><code>self</code><code>.mysql_host,user</code><code>=</code><code>self</code><code>.mysql_user,passwd</code><code>=</code><code>self</code><code>.mysql_passwd).getActNum(first_ips) </code><code>=</code><code>=</code> <code>len</code><code>(first_ips): </code><code>break</code>
<code> </code><code>print</code> <code>'第一波建立完畢'</code>
<code> </code><code>second_create_cmd </code><code>=</code> <code>getCmd(project_info,vmListAnaly(</code><code>self</code><code>.vmlist).getSecondCreInfo(),</code><code>self</code><code>.flavor,mysql_host</code><code>=</code><code>self</code><code>.mysql_host,mysql_user</code><code>=</code><code>self</code><code>.mysql_user,mysql_passwd</code><code>=</code><code>self</code><code>.mysql_passwd).get_cmd()</code>
<code> </code><code>if</code> <code>not</code> <code>second_create_cmd:</code>
<code> </code><code>print</code> <code>green(</code><code>'隻有一波了..建立完畢'</code><code>)</code>
<code> </code><code>sys.exit()</code>
<code> </code><code>create_obj.creating(second_create_cmd,</code><code>3</code><code>)</code>
<code> </code><code>second_ips </code><code>=</code> <code>vmListAnaly(</code><code>'vmhost'</code><code>).getSecondIps()</code>
<code> </code><code>if</code> <code>mysqlEng(host</code><code>=</code><code>self</code><code>.mysql_host,user</code><code>=</code><code>self</code><code>.mysql_user,passwd</code><code>=</code><code>self</code><code>.mysql_passwd).getActNum(second_ips) </code><code>=</code><code>=</code> <code>len</code><code>(second_ips): </code><code>break</code>
<code> </code><code>print</code> <code>'第二波建立完畢'</code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>
<code> </code><code>#project_name = sys.argv[1]</code>
<code> </code><code>#vmlist = sys.argv[2]</code>
<code> </code><code>mysql_host </code><code>=</code> <code>'127.0.0.1'</code>
<code> </code><code>mysql_user </code><code>=</code> <code>'root'</code>
<code> </code><code>mysql_passwd </code><code>=</code> <code>'123456'</code>
<code> </code><code>parser </code><code>=</code> <code>OptionParser()</code>
<code> </code><code>parser.add_option(</code><code>"-c"</code><code>,</code><code>"--create"</code><code>,dest</code><code>=</code><code>"create"</code><code>,action</code><code>=</code><code>"store_true"</code><code>,default</code><code>=</code><code>False</code><code>,</code><code>help</code><code>=</code><code>"create vm in filename"</code><code>)</code>
<code> </code><code>parser.add_option(</code><code>"-u"</code><code>,</code><code>"--update"</code><code>,dest</code><code>=</code><code>"update"</code><code>,</code><code>help</code><code>=</code><code>"update ip to a flavor"</code><code>)</code>
<code> </code><code>parser.add_option(</code><code>"-p"</code><code>,</code><code>"--ping"</code><code>,dest</code><code>=</code><code>"ping"</code><code>,action</code><code>=</code><code>"store_true"</code><code>,default</code><code>=</code><code>False</code><code>,</code><code>help</code><code>=</code><code>"multil threading to ping"</code><code>)</code>
<code> </code><code>parser.add_option(</code><code>"-i"</code><code>,</code><code>"--instances"</code><code>,dest</code><code>=</code><code>"instances"</code><code>,</code><code>help</code><code>=</code><code>"query a ip's info"</code><code>)</code>
<code> </code><code>parser.add_option(</code><code>"-n"</code><code>,</code><code>"--nodes"</code><code>,dest</code><code>=</code><code>"nodes"</code><code>,</code><code>help</code><code>=</code><code>"query a host's info"</code><code>)</code>
<code> </code><code>parser.add_option(</code><code>"-g"</code><code>,</code><code>"--getcmd"</code><code>,dest</code><code>=</code><code>"getcmd"</code><code>,action</code><code>=</code><code>"store_true"</code><code>,default</code><code>=</code><code>False</code><code>,</code><code>help</code><code>=</code><code>"get build vm commands from a file"</code><code>)</code>
<code> </code><code>parser.add_option(</code><code>"-d"</code><code>,</code><code>"--delete"</code><code>,dest</code><code>=</code><code>"delete"</code><code>,</code><code>help</code><code>=</code><code>"delete a instance"</code><code>)</code>
<code> </code><code>parser.add_option(</code><code>"-f"</code><code>,</code><code>"--filename"</code><code>,dest</code><code>=</code><code>"filename"</code><code>,</code><code>help</code><code>=</code><code>"Specify a file"</code><code>)</code>
<code> </code><code>parser.add_option(</code><code>"-F"</code><code>,</code><code>"--flavor"</code><code>,dest</code><code>=</code><code>"flavor"</code><code>,</code><code>help</code><code>=</code><code>"Specify a flavor"</code><code>)</code>
<code> </code><code>parser.add_option(</code><code>"-t"</code><code>,</code><code>"--tenant"</code><code>,dest</code><code>=</code><code>"tenant"</code><code>,</code><code>help</code><code>=</code><code>"Specify a tenant"</code><code>)</code>
<code> </code><code>(options,args) </code><code>=</code> <code>parser.parse_args()</code>
<code> </code><code>project_conf</code><code>=</code><code>{</code>
<code> </code><code>'test'</code><code>:{</code>
<code> </code><code>'OS_USERNAME'</code><code>:</code><code>'test'</code><code>,</code>
<code> </code><code>'OS_PASSWORD'</code><code>:</code><code>'test'</code><code>,</code>
<code> </code><code>'OS_TENANT_NAME'</code><code>:</code><code>'test'</code><code>,</code>
<code> </code><code>'SECURITY_GROUPS'</code><code>:</code><code>'default'</code><code>,</code>
<code> </code><code>'IMAGE_ID'</code><code>:</code><code>'25b349f2-a105-4d2d-aabe-89253e8b4eb1'</code><code>,</code>
<code> </code><code>},</code>
<code> </code><code>'test2'</code><code>:{</code>
<code> </code><code>'OS_USERNAME'</code><code>:</code><code>'test2'</code><code>,</code>
<code> </code><code>'OS_PASSWORD'</code><code>:</code><code>'test2'</code><code>,</code>
<code> </code><code>'OS_TENANT_NAME'</code><code>:</code><code>'test2'</code><code>,</code>
<code> </code><code>'IMAGE_ID'</code><code>:</code><code>'a6955dde-7794-45cc-a468-65ce7d2473c1'</code><code>, </code>
<code> </code><code>}</code>
<code> </code><code>flavor</code><code>=</code><code>{</code>
<code> </code><code>'1'</code><code>:</code><code>'1'</code><code>,</code>
<code> </code><code>'2'</code><code>:</code><code>'2'</code><code>,</code>
<code> </code><code>'4'</code><code>:</code><code>'4'</code><code>,</code>
<code> </code><code>'6'</code><code>:</code><code>'6'</code><code>,</code>
<code> </code><code>'8'</code><code>:</code><code>'8'</code><code>,</code>
<code> </code><code>'12'</code><code>:</code><code>'12'</code><code>,</code>
<code> </code><code>'16'</code><code>:</code><code>'16'</code><code>,</code>
<code> </code><code>the_mysql_obj </code><code>=</code> <code>mysqlEng(host</code><code>=</code><code>mysql_host,user</code><code>=</code><code>mysql_user,passwd</code><code>=</code><code>mysql_passwd)</code>
<code> </code><code>if</code> <code>options.create:</code>
<code> </code><code>project_info </code><code>=</code> <code>project_conf[options.tenant]</code>
<code> </code><code>vmfile </code><code>=</code> <code>options.filename</code>
<code> </code><code>the_create_obj </code><code>=</code> <code>createAllvm(vmlist</code><code>=</code><code>vmfile,flavor</code><code>=</code><code>flavor,mysql_host</code><code>=</code><code>mysql_host,mysql_user</code><code>=</code><code>mysql_user,mysql_passwd</code><code>=</code><code>mysql_passwd)</code>
<code> </code><code>the_create_obj.start()</code>
<code> </code><code>if</code> <code>options.update:</code>
<code> </code><code>ip </code><code>=</code> <code>options.update</code>
<code> </code><code>flavor </code><code>=</code> <code>options.flavor</code>
<code> </code><code>the_mysql_obj.updateInstanceFlavor(ip,flavor)</code>
<code> </code><code>print</code> <code>"update ok,now the vm %s is %s cups and %sMB memory"</code> <code>%</code> <code>the_mysql_obj.getInstanceFlavor(ip)</code>
<code> </code><code>instance_id </code><code>=</code> <code>the_mysql_obj.getInstanceInfo([ip])[</code><code>0</code><code>][</code><code>0</code><code>]</code>
<code> </code><code>print</code> <code>red(</code><code>'please command == nova reboot --hard %s == to effect'</code> <code>%</code> <code>instance_id)</code>
<code> </code><code>if</code> <code>options.ping:</code>
<code> </code><code>filename </code><code>=</code> <code>options.filename</code>
<code> </code><code>allip </code><code>=</code> <code>vmListAnaly(filename).getAllIps()</code>
<code> </code><code>check_obj </code><code>=</code> <code>checkIps()</code>
<code> </code><code>check_obj.put2q(allip)</code>
<code> </code><code>check_ret </code><code>=</code> <code>check_obj.checking()</code>
<code> </code><code>if</code> <code>check_ret[</code><code>'up'</code><code>]:</code>
<code> </code><code>for</code> <code>ip </code><code>in</code> <code>check_ret[</code><code>'up'</code><code>]:</code>
<code> </code><code>print</code> <code>red(</code><code>"%s is up,please check..."</code><code>) </code><code>%</code> <code>ip</code>
<code> </code><code>sys.exit(</code><code>9</code><code>)</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>print</code> <code>green(</code><code>'All ip is check ok...,you can create these vms'</code><code>)</code>
<code> </code><code>if</code> <code>options.instances:</code>
<code> </code><code>args.append(options.instances)</code>
<code> </code><code>ips </code><code>=</code> <code>args</code>
<code> </code><code>instances_info </code><code>=</code> <code>the_mysql_obj.getInstanceInfo(ips)</code>
<code> </code><code>print</code> <code>"id\t\t\t\t\tip\t\tnode\t\t\tstate\tmemory"</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>instances_info:</code>
<code> </code><code>print</code> <code>"%s\t%s\t%s\t%s\t%s"</code> <code>%</code> <code>i</code>
<code> </code><code>if</code> <code>options.nodes:</code>
<code> </code><code>args.append(options.nodes)</code>
<code> </code><code>nodes </code><code>=</code> <code>args</code>
<code> </code><code>nodes_info </code><code>=</code> <code>the_mysql_obj.getNodeInfo(nodes)</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>nodes_info:</code>
<code> </code><code>if</code> <code>options.getcmd:</code>
<code> </code><code>tenant </code><code>=</code> <code>options.tenant</code>
<code> </code><code>project_info </code><code>=</code> <code>project_conf[tenant]</code>
<code> </code><code>result </code><code>=</code> <code>getCmd(project_info,vmListAnaly(filename).getAllCreInfo(),flavor,mysql_host</code><code>=</code><code>mysql_host,mysql_user</code><code>=</code><code>mysql_user,mysql_passwd</code><code>=</code><code>mysql_passwd).get_cmd()</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>result:</code>
<code> </code><code>print</code> <code>i</code>
<code> </code><code>if</code> <code>options.delete:</code>
<code> </code><code>args.append(options.delete)</code>
<code> </code><code>instances_ids</code><code>=</code><code>[]</code>
<code> </code><code>instances_ids.append(i[</code><code>0</code><code>])</code>
<code> </code><code>if</code> <code>not</code> <code>instances_ids:</code>
<code> </code><code>print</code> <code>red(</code><code>"no instance found"</code><code>)</code>
<code> </code><code>sys.exit(</code><code>8</code><code>)</code>
<code> </code><code>delete_cmd </code><code>=</code> <code>"nova delete "</code> <code>+</code> <code>' '</code><code>.join(instances_ids)</code>
<code> </code><code>result </code><code>=</code> <code>commands.getstatusoutput(delete_cmd)</code>
<code> </code><code>if</code> <code>result[</code><code>0</code><code>] </code><code>=</code><code>=</code> <code>0</code><code>:</code>
<code> </code><code>print</code> <code>green(</code><code>'OK'</code><code>)</code>
<code> </code><code>print</code> <code>red(</code><code>"error info: %s"</code> <code>%</code> <code>result[</code><code>1</code><code>])</code>
本文轉自lustlost 51CTO部落格,原文連結:http://blog.51cto.com/lustlost/1375779,如需轉載請自行聯系原作者