天天看點

【python】openstack管理小工具(增删查改,批量ping)

工具介紹:

建立虛拟機會使用多線程隊列的方式去控制同時建立的虛拟機數量

如果在建立的虛拟機比較多,會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) &gt; </code><code>0</code><code>:</code>

<code>            </code><code>while</code> <code>q.qsize() &lt;</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() &gt; </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,如需轉載請自行聯系原作者