<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,如需轉載請自行聯系原作者