天天看點

3.ansible1.7.2 callback插件擷取硬體資訊并插入到資料庫中

<code>#url: http://www.shencan.net/index.php/2014/07/17/ansible-%E6%8F%92%E4%BB%B6%E4%B9%8Bcallback_plugins-%EF%BC%88%E5%AE%9E%E6%88%98%EF%BC%89/</code>

<code>cat </code><code>/</code><code>etc</code><code>/</code><code>ansible</code><code>/</code><code>ansible.cfg|grep callback|grep </code><code>-</code><code>v </code><code>"#"</code>

<code>callback_plugins   </code><code>=</code> <code>/</code><code>usr</code><code>/</code><code>share</code><code>/</code><code>ansible</code><code>/</code><code>plugins</code><code>/</code><code>callback</code>

<code>bin_ansible_callbacks </code><code>=</code> <code>True</code>

<code>cat </code><code>/</code><code>usr</code><code>/</code><code>share</code><code>/</code><code>ansible</code><code>/</code><code>plugins</code><code>/</code><code>callback</code><code>/</code><code>log_plays.py</code>

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

<code># coding:utf8</code>

<code># 插入到資料庫中</code>

<code>import</code> <code>simplejson</code>

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

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

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

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

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

<code>import</code> <code>time</code>

<code># import sqlite3</code>

<code>#import redis</code>

<code>import</code> <code>datetime</code>

<code>from</code> <code>pymongo </code><code>import</code> <code>MongoClient</code>

<code>mongoinfo </code><code>=</code> <code>{</code><code>"host"</code><code>:</code><code>"127.0.0.1"</code><code>,</code><code>"port"</code><code>:</code><code>"27408"</code><code>,</code><code>"user"</code><code>:</code><code>"root"</code><code>,</code><code>"password"</code><code>:</code><code>"root"</code><code>,</code><code>"dbname"</code><code>:</code><code>"ansible_log"</code><code>}  </code>

<code>dbname </code><code>=</code> <code>'/tmp/setup.db'</code>

<code>TIME_FORMAT</code><code>=</code><code>'%Y-%m-%d %H:%M:%S'</code>

<code>'''</code>

<code>try:</code>

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

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

<code>except:</code>

<code>    </code><code>pass</code>

<code>def</code> <code>InsertMDB(values):</code>

<code>    </code><code>global</code> <code>mongoinfo</code>

<code>    </code><code>dbhost </code><code>=</code> <code>mongoinfo[</code><code>'host'</code><code>]</code>

<code>    </code><code>dbport </code><code>=</code> <code>mongoinfo[</code><code>'port'</code><code>]</code>

<code>    </code><code>dbuser </code><code>=</code> <code>mongoinfo[</code><code>'user'</code><code>]</code>

<code>    </code><code>dbpwd  </code><code>=</code> <code>mongoinfo[</code><code>'password'</code><code>]</code>

<code>    </code><code>dbname </code><code>=</code> <code>mongoinfo[</code><code>'dbname'</code><code>]</code>

<code>    </code><code>uri </code><code>=</code> <code>'mongodb://%s:%s@%s/%s'</code><code>%</code><code>(dbuser,dbpwd,dbhost,dbname)</code>

<code>    </code><code>#client = MongoClient(uri,safe=False)</code>

<code>    </code><code>client </code><code>=</code> <code>MongoClient(uri)</code>

<code>    </code><code>db </code><code>=</code> <code>client.ansible_log</code>

<code>    </code><code>db.callback.insert(values)</code>

<code>class</code> <code>DB():</code>

<code>    </code><code>def</code> <code>__init__(</code><code>self</code><code>):</code>

<code>        </code><code>self</code><code>.db </code><code>=</code> <code>MySQLdb.connect(</code><code>"localhost"</code><code>, </code><code>"root"</code><code>, </code><code>"root"</code><code>, </code><code>"cmdb"</code><code>)</code>

<code>        </code><code>self</code><code>.cursor </code><code>=</code> <code>self</code><code>.db.cursor()</code>

<code>    </code><code>def</code> <code>insert_hosts(</code><code>self</code><code>,ipdict):</code>

<code>            </code><code>ip </code><code>=</code> <code>ipdict[</code><code>'ip'</code><code>]</code>

<code>            </code><code>hostname </code><code>=</code> <code>ipdict[</code><code>'hostname'</code><code>]</code>

<code>            </code><code>vcpus </code><code>=</code> <code>ipdict[</code><code>'cpu_core'</code><code>]</code>

<code>            </code><code>mem </code><code>=</code> <code>ipdict[</code><code>'memory'</code><code>]</code>

<code>            </code><code>disk_total </code><code>=</code> <code>ipdict[</code><code>'disk'</code><code>]</code>

<code>            </code><code>check_host </code><code>=</code> <code>"select * from hosts_copy where IP = '%s' "</code> <code>%</code> <code>(ip)</code>

<code>            </code><code>flag </code><code>=</code> <code>self</code><code>.cursor.execute(check_host)</code>

<code>            </code><code>if</code> <code>flag !</code><code>=</code> <code>0L</code><code>:</code>

<code>                </code><code>sql </code><code>=</code> <code>"update hosts_copy set hostname = '%s',vcpus = '%s',mem = '%s',disk_total ='%s' where ip = '%s' "</code> <code>%</code> <code>(</code>

<code>                    </code><code>hostname, vcpus, mem, disk_total, ip)</code>

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

<code>                    </code><code>print</code> <code>(sql, </code><code>'******************'</code><code>)</code>

<code>                    </code><code>self</code><code>.cursor.execute(sql)</code>

<code>                    </code><code># 送出到資料庫執行</code>

<code>                    </code><code>self</code><code>.db.commit()</code>

<code>                    </code><code>print</code> <code>(</code><code>" '%s' update successfully !"</code><code>) </code><code>%</code> <code>(ip)</code>

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

<code>                    </code><code># 發生錯誤時復原</code>

<code>                    </code><code>self</code><code>.db.rollback()</code>

<code>                    </code><code>print</code> <code>'Something is wrong !!! '</code>

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

<code>                </code><code>sql </code><code>=</code> <code>"INSERT INTO hosts_copy(ip,hostname,vcpus,mem,disk_total) VALUES('%s','%s','%s','%s','%s')"</code> <code>%</code> <code>(</code>

<code>                    </code><code>ip, hostname, vcpus, mem, disk_total)</code>

<code>                </code><code>print</code> <code>sql</code>

<code>                </code><code>self</code><code>.cursor.execute(sql)</code>

<code>                </code><code>self</code><code>.db.commit()</code>

<code>def</code> <code>log(host, data):</code>

<code>#    if type(data) == dict:</code>

<code>#        invocation = data.pop('invocation', None)</code>

<code>#        if invocation.get('module_name', None) != 'setup':</code>

<code>#            return</code>

<code>#</code>

<code>#    facts = data.get('ansible_facts', None)</code>

<code>#    now = time.strftime(TIME_FORMAT, time.localtime())</code>

<code>#    try:</code>

<code>#        # `host` is a unique index</code>

<code>#        cur.execute("REPLACE INTO inventory (now, host, arch, dist, distvers, sys,kernel) VALUES(?,?,?,?,?,?,?);",</code>

<code>#        (</code>

<code>#            now,</code>

<code>#            facts.get('ansible_hostname', None),</code>

<code>#            facts.get('ansible_architecture', None),</code>

<code>#            facts.get('ansible_distribution', None),</code>

<code>#            facts.get('ansible_distribution_version', None),</code>

<code>#            facts.get('ansible_system', None),</code>

<code>#            facts.get('ansible_kernel', None)</code>

<code>#        ))</code>

<code>#        con.commit()</code>

<code>#    except:</code>

<code>#        pass</code>

<code>class</code> <code>CallbackModule(</code><code>object</code><code>):</code>

<code>    </code><code>def</code> <code>runner_on_ok(</code><code>self</code><code>, host, res):</code>

<code>        </code><code>if</code> <code>'stdout'</code> <code>in</code> <code>res.keys() </code><code>and</code> <code>res[</code><code>'stdout'</code><code>]:</code>

<code>            </code><code>#print eval(res['stdout'].encode("utf-8"))</code>

<code>            </code><code>#res_stdout = res['stdout'].encode("utf-8")</code>

<code>            </code><code>res_stdout </code><code>=</code> <code>res[</code><code>'stdout'</code><code>].strip(</code><code>'\r\n'</code><code>).split(</code><code>'\n'</code><code>)[</code><code>-</code><code>1</code><code>]</code>

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

<code>                            </code><code>res_dict </code><code>=</code> <code>eval</code><code>(res_stdout)</code>

<code>                            </code><code>db </code><code>=</code> <code>DB()</code>

<code>                            </code><code>db.insert_hosts(res_dict)</code>

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

<code>                            </code><code>pass</code>

<code>            </code> 

<code>        </code><code>#host=host=res._host.get_name()</code>

<code>        </code><code>#r = redis.Redis(host='127.0.0.1', port=6379, db=0) </code>

<code>        </code><code>#r.set(host,str(res))</code>

<code>        </code><code>#f = open('/tmp/11','a')</code>

<code>        </code><code>#f.write(str(host))</code>

<code>        </code><code>#f.write(str(res))</code>

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

<code>        </code><code>#log(host, res)</code>

<code>        </code><code>'''</code>

<code>        </code><code>now = datetime.datetime.now()</code>

<code>        </code><code>result = res</code>

<code>        </code><code>result['time'] = now.strftime(TIME_FORMAT)</code>

<code>        </code><code>result['status'] = 'ok'</code>

<code>        </code><code>InsertMDB(result)</code>

<code>    </code><code>def</code> <code>runner_on_failed(</code><code>self</code><code>, host, res, ignore_errors</code><code>=</code><code>False</code><code>):</code>

<code>        </code><code>f </code><code>=</code> <code>open</code><code>(</code><code>'/tmp/12'</code><code>,</code><code>'a'</code><code>)</code>

<code>        </code><code>f.write(</code><code>str</code><code>(host))</code>

<code>        </code><code>f.write(</code><code>str</code><code>(res))</code>

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

<code>        </code><code>log(host, res)</code>

<code>說明</code>

<code>1.</code><code>插入mongodb</code>

<code>2.</code><code>插入mysql</code>

<code>在插入mysql的時候,最基本的log(host, data),可以擷取setup的資訊,是以在做機器初始化,可以通過setup子產品擷取,額外的需要自己寫腳本,然後得到res</code>

使用ansible-playbook -i hosts main.yml

最後附一張大神做的圖檔

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