天天看點

ansible inventory

<code>#!/usr/bin/env python</code>

<code> </code> 

<code>import</code> <code>sqlite3</code>

<code>import</code> <code>sys</code>

<code>try</code><code>:</code>

<code>    </code><code>import</code> <code>json</code>

<code>except</code> <code>ImportError:</code>

<code>    </code><code>import</code> <code>simplejson as json</code>

<code>dbname </code><code>=</code> <code>'/etc/ansible/books.db'</code>

<code>def</code> <code>grouplist(conn):</code>

<code>    </code><code>inventory </code><code>=</code><code>{}</code>

<code>    </code><code>inventory[</code><code>'local'</code><code>] </code><code>=</code> <code>[ </code><code>'127.0.0.1'</code> <code>]</code>

<code>    </code><code>cur </code><code>=</code> <code>conn.cursor()</code>

<code>    </code><code>cur.execute(</code><code>"SELECT type, name FROM hosts ORDER BY 1, 2"</code><code>)</code>

<code>    </code><code>for</code> <code>row </code><code>in</code> <code>cur.fetchall():</code>

<code>        </code><code>group </code><code>=</code> <code>row[</code><code>'type'</code><code>]</code>

<code>        </code><code>if</code> <code>group </code><code>is</code> <code>None</code><code>:</code>

<code>            </code><code>group </code><code>=</code> <code>'ungrouped'</code>

<code>         </code> 

<code>        </code><code>if</code> <code>not</code> <code>group </code><code>in</code> <code>inventory:</code>

<code>            </code><code>inventory[group] </code><code>=</code> <code>{</code>

<code>                </code><code>'hosts'</code> <code>: []</code>

<code>            </code><code>}</code>

<code>        </code><code>inventory[group][</code><code>'hosts'</code><code>].append(row[</code><code>'name'</code><code>])</code>

<code>    </code><code>cur.close()</code>

<code>    </code><code>print</code> <code>json.dumps(inventory, indent</code><code>=</code><code>4</code><code>)</code>

<code>def</code> <code>hostinfo(conn, name):</code>

<code>    </code><code>vars</code> <code>=</code> <code>{}</code>

<code>    </code><code>cur.execute(</code><code>"SELECT COUNT(*) FROM hosts WHERE name=?"</code><code>, (name, ))</code>

<code>    </code><code>row </code><code>=</code> <code>cur.fetchone()</code>

<code>    </code><code>if</code> <code>row[</code><code>0</code><code>] </code><code>=</code><code>=</code> <code>0</code><code>:</code>

<code>        </code><code>print</code> <code>json.dumps({})</code>

<code>        </code><code>sys.exit(</code><code>0</code><code>)</code>

<code>    </code><code># Inject some variables for all hosts</code>

<code>    </code><code>vars</code> <code>=</code> <code>{</code>

<code>        </code><code>'admin'</code>         <code>: </code><code>'Jane Jolie'</code><code>,</code>

<code>        </code><code>'datacenter'</code>    <code>: </code><code>1</code>

<code>    </code><code>}</code>

<code>    </code><code>if</code> <code>'ldap'</code> <code>in</code> <code>name.lower():</code>

<code>        </code><code>vars</code><code>[</code><code>'baseDN'</code><code>] </code><code>=</code> <code>'dc=mens,dc=de'</code>

<code>    </code><code>print</code> <code>json.dumps(</code><code>vars</code><code>, indent</code><code>=</code><code>4</code><code>)</code>

<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>

<code>    </code><code>con </code><code>=</code> <code>sqlite3.connect(dbname)</code>

<code>    </code><code>con.row_factory</code><code>=</code><code>sqlite3.Row</code>

<code>    </code><code>if</code> <code>len</code><code>(sys.argv) </code><code>=</code><code>=</code> <code>2</code> <code>and</code> <code>(sys.argv[</code><code>1</code><code>] </code><code>=</code><code>=</code> <code>'--list'</code><code>):</code>

<code>        </code><code>grouplist(con)</code>

<code>    </code><code>elif</code> <code>len</code><code>(sys.argv) </code><code>=</code><code>=</code> <code>3</code> <code>and</code> <code>(sys.argv[</code><code>1</code><code>] </code><code>=</code><code>=</code> <code>'--host'</code><code>):</code>

<code>        </code><code>hostinfo(con, sys.argv[</code><code>2</code><code>])</code>

<code>    </code><code>else</code><code>:</code>

<code>        </code><code>print</code> <code>"Usage: %s --list or --host &lt;hostname&gt;"</code> <code>%</code> <code>sys.argv[</code><code>0</code><code>]</code>

<code>        </code><code>sys.exit(</code><code>1</code><code>)</code>

<code>    </code><code>con.close()</code>

測試

ansible -i test01.py xx -m shell -a "uname -a"

具體參考 

<a href="http://rfyiamcool.blog.51cto.com/1030776/1416808/" target="_blank">http://rfyiamcool.blog.51cto.com/1030776/1416808/</a>

<a href="http://noops.me/?p=1446&amp;utm_source=tuicool&amp;utm_medium=referral" target="_blank">http://noops.me/?p=1446&amp;utm_source=tuicool&amp;utm_medium=referral</a>

更新

<code># !/usr/bin/env python</code>

<code># coding:utf-8</code>

<code>def</code> <code>grouplist():</code>

<code>    </code><code>inventory </code><code>=</code> <code>{}</code>

<code>    </code><code>inventory[</code><code>'local'</code><code>] </code><code>=</code> <code>[</code><code>'127.0.0.1'</code><code>]</code>

<code>    </code><code>sfile</code><code>=</code><code>'/home/python/books.txt'</code>

<code>    </code><code>with </code><code>open</code><code>(sfile,</code><code>'rb'</code><code>) as f:</code>

<code>        </code><code>for</code> <code>i </code><code>in</code> <code>f.readlines():</code>

<code>            </code><code>group</code><code>=</code><code>i.strip().split()[</code><code>1</code><code>]</code>

<code>            </code><code>name</code><code>=</code><code>i.strip().split()[</code><code>0</code><code>]</code>

<code>            </code><code>if</code> <code>not</code> <code>group </code><code>in</code> <code>inventory:</code>

<code>                </code><code>inventory[group] </code><code>=</code> <code>{</code>

<code>                    </code><code>'hosts'</code><code>: []</code>

<code>                </code><code>}</code>

<code>            </code><code>inventory[group][</code><code>'hosts'</code><code>].append(name)</code>

<code>        </code><code>print</code> <code>json.dumps(inventory, indent</code><code>=</code><code>4</code><code>)</code>

<code>        </code><code>'admin'</code><code>: </code><code>'Jane Jolie'</code><code>,</code>

<code>        </code><code>'datacenter'</code><code>: </code><code>1</code>

<code>        </code><code>grouplist()</code>

<code>        </code><code>hostinfo(sys.argv[</code><code>2</code><code>])</code>

<code>cat books.txt cxx代表組名</code>

<code>cxx </code><code>172.1</code><code>.</code><code>1.196</code> <code>sc_tomcat </code><code>8005</code> <code>8080</code>

<code>sxx </code><code>172.1</code><code>.</code><code>1.196</code> <code>sc_tomcat </code><code>8006</code> <code>8081</code>

<code>wxx </code><code>172.1</code><code>.</code><code>1.196</code> <code>sc_tomcat </code><code>8007</code> <code>8082</code>

<code>第三種</code>

<code>#從mysql hosts表生成最新的ansible hosts檔案</code>

<code>import</code> <code>os</code>

<code>import</code> <code>commands</code>

<code>import</code> <code>MySQLdb</code>

<code>import</code> <code>json</code>

<code>def</code> <code>Inventory(iplist1):</code>

<code>    </code><code>#不用</code>

<code>    </code><code>for</code> <code>ip </code><code>in</code> <code>iplist1:</code>

<code>        </code><code>if</code> <code>ip </code><code>in</code> <code>dict</code><code>.iterkeys():</code>

<code>            </code><code># print ip,dict[ip]</code>

<code>            </code><code>group </code><code>=</code> <code>dict</code><code>[ip]</code>

<code>            </code><code>inventory[group][</code><code>'hosts'</code><code>].append(ip)</code>

<code>def</code> <code>grouplist(conn,</code><code>file</code><code>):</code>

<code>    </code><code>#inventory['local'] = ['127.0.0.1']</code>

<code>    </code><code>cur.execute(</code><code>"SELECT ip,env from hosts ORDER BY 1, 2"</code><code>)</code>

<code>        </code><code>group </code><code>=</code> <code>row[</code><code>1</code><code>]</code>

<code>        </code><code>if</code> <code>len</code><code>(group.split(</code><code>','</code><code>))&gt;</code><code>1</code><code>:</code>

<code>            </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(</code><code>len</code><code>(group.split(</code><code>','</code><code>))):</code>

<code>                </code><code>pgroup </code><code>=</code> <code>group.split(</code><code>','</code><code>)[i]</code>

<code>                </code><code>ip </code><code>=</code> <code>row[</code><code>0</code><code>]</code>

<code>                </code><code>if</code> <code>not</code> <code>pgroup </code><code>in</code> <code>inventory:</code>

<code>                    </code><code>inventory[pgroup] </code><code>=</code> <code>{</code>

<code>                        </code><code>'hosts'</code><code>: []</code>

<code>                    </code><code>}</code>

<code>                </code><code>inventory[pgroup][</code><code>'hosts'</code><code>].append(ip)</code>

<code>        </code><code>else</code><code>:</code>

<code>            </code><code>if</code> <code>group </code><code>is</code> <code>None</code><code>:</code>

<code>                </code><code>group </code><code>=</code> <code>'ungrouped'</code>

<code>            </code><code>inventory[group][</code><code>'hosts'</code><code>].append(row[</code><code>0</code><code>])</code>

<code>    </code><code>anum </code><code>=</code> <code>0</code>

<code>    </code><code>for</code> <code>num </code><code>in</code> <code>inventory.items():</code>

<code>        </code><code>anum  </code><code>+</code><code>=</code>  <code>len</code><code>(num[</code><code>1</code><code>][</code><code>'hosts'</code><code>])</code>

<code>    </code><code>print</code> <code>anum</code>

<code>    </code><code>f </code><code>=</code> <code>open</code><code>(</code><code>file</code><code>, </code><code>'w'</code><code>)</code>

<code>    </code><code>f.write(json.dumps(inventory, indent</code><code>=</code><code>4</code><code>))</code>

<code>    </code><code>f.close()</code>

<code>    </code><code>conn </code><code>=</code> <code>MySQLdb.connect(</code><code>"172.1.1.197"</code><code>, </code><code>"root"</code><code>, </code><code>"root"</code><code>, </code><code>"cmdb"</code><code>)</code>

<code>    </code><code>file</code> <code>=</code> <code>'mysql_inventory'</code>

<code>    </code><code>grouplist(conn,</code><code>file</code><code>)</code>

本文轉自 liqius 51CTO部落格,原文連結:http://blog.51cto.com/szgb17/1917739,如需轉載請自行聯系原作者