<code>pip install ansible</code><code>=</code><code>=</code><code>2.2</code>
<code>cat main.yml </code>
<code>-</code> <code>hosts: </code><code>all</code>
<code> </code><code>remote_user: root</code>
<code> </code><code>vars</code><code>:</code>
<code> </code><code>tasks:</code>
<code> </code><code>-</code> <code>name: hostinfo </code>
<code> </code><code>script: hostinfo.py</code>
<code>cat hostinfo.py</code>
<code>#!/usr/bin/env python</code>
<code># coding:utf8</code>
<code># author:Allentuns</code>
<code># time:2015-02-14</code>
<code>#url: http://blog.51cto.com/467754239/1616806</code>
<code>from</code> <code>subprocess </code><code>import</code> <code>Popen, PIPE</code>
<code>import</code> <code>urllib, urllib2</code>
<code>import</code> <code>pickle</code>
<code>import</code> <code>json</code>
<code>import</code> <code>re</code>
<code>###[hostname message]#####</code>
<code>def</code> <code>get_HostnameInfo(</code><code>file</code><code>):</code>
<code> </code><code>with </code><code>open</code><code>(</code><code>file</code><code>, </code><code>'r'</code><code>) as fd:</code>
<code> </code><code>data </code><code>=</code> <code>fd.read().split(</code><code>'\n'</code><code>)</code>
<code> </code><code>for</code> <code>line </code><code>in</code> <code>data:</code>
<code> </code><code>if</code> <code>line.startswith(</code><code>'HOSTNAME'</code><code>):</code>
<code> </code><code>hostname </code><code>=</code> <code>line.split(</code><code>'='</code><code>)[</code><code>1</code><code>]</code>
<code> </code><code>break</code>
<code> </code><code>return</code> <code>hostname</code>
<code>#####[ipaddr message]#####</code>
<code>def</code> <code>get_Ipaddr():</code>
<code> </code><code>P </code><code>=</code> <code>Popen([</code><code>'ifconfig'</code><code>], stdout</code><code>=</code><code>PIPE)</code>
<code> </code><code>data </code><code>=</code> <code>P.stdout.read()</code>
<code> </code><code>list</code> <code>=</code> <code>[]</code>
<code> </code><code>str</code> <code>=</code> <code>''</code>
<code> </code><code>option </code><code>=</code> <code>False</code>
<code> </code><code>lines </code><code>=</code> <code>data.split(</code><code>'\n'</code><code>)</code>
<code> </code><code>for</code> <code>line </code><code>in</code> <code>lines:</code>
<code> </code><code>if</code> <code>not</code> <code>line.startswith(</code><code>' '</code><code>):</code>
<code> </code><code>list</code><code>.append(</code><code>str</code><code>)</code>
<code> </code><code>str</code> <code>=</code> <code>line</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>str</code> <code>+</code><code>=</code> <code>line</code>
<code> </code><code>while</code> <code>True</code><code>:</code>
<code> </code><code>if</code> <code>'' </code><code>in</code> <code>list</code><code>:</code>
<code> </code><code>list</code><code>.remove('')</code>
<code> </code><code>break</code>
<code> </code><code>r_devname </code><code>=</code> <code>re.</code><code>compile</code><code>(</code><code>'(eth\d*|lo)'</code><code>)</code>
<code> </code><code>r_mac </code><code>=</code> <code>re.</code><code>compile</code><code>(</code><code>'HWaddr\s([A-F0-9:]{17})'</code><code>)</code>
<code> </code><code>r_ip </code><code>=</code> <code>re.</code><code>compile</code><code>(</code><code>'addr:([\d.]{7,15})'</code><code>)</code>
<code> </code><code>for</code> <code>line </code><code>in</code> <code>list</code><code>:</code>
<code> </code><code>devname </code><code>=</code> <code>r_devname.findall(line)</code>
<code> </code><code>mac </code><code>=</code> <code>r_mac.findall(line)</code>
<code> </code><code>ip </code><code>=</code> <code>r_ip.findall(line)</code>
<code> </code><code>if</code> <code>mac:</code>
<code> </code><code>return</code> <code>ip[</code><code>0</code><code>]</code>
<code>#####[osversion message]#####</code>
<code>def</code> <code>get_OsVerion(</code><code>file</code><code>):</code>
<code> </code><code>with </code><code>open</code><code>(</code><code>file</code><code>) as fd:</code>
<code> </code><code>lines </code><code>=</code> <code>fd.readlines()</code>
<code> </code><code>os_version </code><code>=</code> <code>lines[</code><code>0</code><code>][:</code><code>-</code><code>8</code><code>]</code>
<code> </code><code>return</code> <code>os_version</code>
<code>#####[memory message]#####</code>
<code>def</code> <code>get_MemoryInfo(</code><code>file</code><code>):</code>
<code> </code><code>data_list </code><code>=</code> <code>fd.read().split(</code><code>'\n'</code><code>)</code>
<code> </code><code>MemTotal_line </code><code>=</code> <code>data_list[</code><code>0</code><code>]</code>
<code> </code><code>Memory_K </code><code>=</code> <code>MemTotal_line.split()[</code><code>1</code><code>]</code>
<code> </code><code>Memory_G </code><code>=</code> <code>float</code><code>(Memory_K) </code><code>/</code> <code>1000</code> <code>/</code> <code>1000</code>
<code> </code><code>Memory_G2 </code><code>=</code> <code>'%.2f'</code> <code>%</code> <code>Memory_G</code>
<code> </code><code>memory </code><code>=</code> <code>Memory_G2 </code><code>+</code> <code>'G'</code>
<code> </code><code>return</code> <code>memory</code>
<code>#####[disk message]#####</code>
<code>def</code> <code>get_DiskInfo():</code>
<code> </code><code>p </code><code>=</code> <code>Popen([</code><code>'fdisk'</code><code>, </code><code>'-l'</code><code>], stdout</code><code>=</code><code>PIPE, stderr</code><code>=</code><code>PIPE)</code>
<code> </code><code>stdout, stderr </code><code>=</code> <code>p.communicate()</code>
<code> </code><code>diskdata </code><code>=</code> <code>stdout</code>
<code> </code><code>disk_initial_size </code><code>=</code> <code>0</code>
<code> </code><code>re_disk_type </code><code>=</code> <code>re.</code><code>compile</code><code>(r</code><code>'Disk /dev/[shd]{1}.*:\s+[\d.\s\w]*,\s+([\d]+).*'</code><code>)</code>
<code> </code><code>disk_size_bytes </code><code>=</code> <code>re_disk_type.findall(diskdata)</code>
<code> </code><code>for</code> <code>size </code><code>in</code> <code>disk_size_bytes:</code>
<code> </code><code>disk_initial_size </code><code>+</code><code>=</code> <code>int</code><code>(size)</code>
<code> </code><code>disk_size_total_bytes </code><code>=</code> <code>'%.2f'</code> <code>%</code> <code>(</code><code>float</code><code>(disk_initial_size) </code><code>/</code> <code>1000</code> <code>/</code> <code>1000</code> <code>/</code> <code>1000</code><code>)</code>
<code> </code><code>disk_size_total_G </code><code>=</code> <code>disk_size_total_bytes </code><code>+</code> <code>'G'</code>
<code> </code><code>disk </code><code>=</code> <code>disk_size_total_G</code>
<code> </code><code>return</code> <code>disk</code>
<code>#####[cpu message]#####</code>
<code>def</code> <code>get_CpuInfo():</code>
<code> </code><code>p </code><code>=</code> <code>Popen([</code><code>'cat'</code><code>, </code><code>'/proc/cpuinfo'</code><code>], stdout</code><code>=</code><code>PIPE, stderr</code><code>=</code><code>PIPE)</code>
<code> </code><code>cpudata </code><code>=</code> <code>stdout.strip()</code>
<code> </code><code>cpu_dict </code><code>=</code> <code>{}</code>
<code> </code><code>re_cpu_cores </code><code>=</code> <code>re.</code><code>compile</code><code>(r</code><code>'processor\s+:\s+([\d])'</code><code>)</code>
<code> </code><code>re_vendor_id </code><code>=</code> <code>re.</code><code>compile</code><code>(r</code><code>'vendor_id\s+:\s([\w]+)'</code><code>)</code>
<code> </code><code>re_model_name </code><code>=</code> <code>re.</code><code>compile</code><code>(r</code><code>'model name\s+:\s+(.*)'</code><code>)</code>
<code> </code><code>res_cpu_cores </code><code>=</code> <code>re_cpu_cores.findall(cpudata)</code>
<code> </code><code>cpu_dict[</code><code>'Cpu_Cores'</code><code>] </code><code>=</code> <code>int</code><code>(res_cpu_cores[</code><code>-</code><code>1</code><code>]) </code><code>+</code> <code>1</code>
<code> </code><code>res_vendor_id </code><code>=</code> <code>re_vendor_id.findall(cpudata)</code>
<code> </code><code>cpu_dict[</code><code>'Vendor_Id'</code><code>] </code><code>=</code> <code>res_vendor_id[</code><code>-</code><code>1</code><code>]</code>
<code> </code><code>res_model_name </code><code>=</code> <code>re_model_name.findall(cpudata)</code>
<code> </code><code>cpu_dict[</code><code>'Model_Name'</code><code>] </code><code>=</code> <code>res_model_name[</code><code>-</code><code>1</code><code>]</code>
<code> </code><code>return</code> <code>cpu_dict</code>
<code>#####[Demi message]#####</code>
<code>def</code> <code>get_dmidecode():</code>
<code> </code><code>P </code><code>=</code> <code>Popen([</code><code>'dmidecode'</code><code>], stdout</code><code>=</code><code>PIPE)</code>
<code> </code><code>lines </code><code>=</code> <code>data.split(</code><code>'\n\n'</code><code>)</code>
<code> </code><code>dmidecode_line </code><code>=</code> <code>lines[</code><code>2</code><code>]</code>
<code> </code><code>line </code><code>=</code> <code>[i.strip() </code><code>for</code> <code>i </code><code>in</code> <code>dmidecode_line.split(</code><code>'\n'</code><code>) </code><code>if</code> <code>i]</code>
<code> </code><code>Manufacturer </code><code>=</code> <code>line[</code><code>2</code><code>].split(</code><code>': '</code><code>)[</code><code>-</code><code>1</code><code>]</code>
<code> </code><code>product </code><code>=</code> <code>line[</code><code>3</code><code>].split(</code><code>': '</code><code>)[</code><code>-</code><code>1</code><code>]</code>
<code> </code><code>sn </code><code>=</code> <code>line[</code><code>5</code><code>].split(</code><code>': '</code><code>)[</code><code>-</code><code>1</code><code>]</code>
<code> </code><code>return</code> <code>Manufacturer, product, sn</code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>
<code> </code><code>#####[get data]#####</code>
<code> </code><code>hostname </code><code>=</code> <code>get_HostnameInfo(</code><code>'/etc/sysconfig/network'</code><code>)</code>
<code> </code><code>ip </code><code>=</code> <code>get_Ipaddr()</code>
<code> </code><code>osversion </code><code>=</code> <code>get_OsVerion(</code><code>'/etc/issue'</code><code>)</code>
<code> </code><code>memory </code><code>=</code> <code>get_MemoryInfo(</code><code>'/proc/meminfo'</code><code>)</code>
<code> </code><code>disk </code><code>=</code> <code>get_DiskInfo()</code>
<code> </code><code>Vendor_Id </code><code>=</code> <code>get_CpuInfo()[</code><code>'Vendor_Id'</code><code>]</code>
<code> </code><code>Model_Name </code><code>=</code> <code>get_CpuInfo()[</code><code>'Model_Name'</code><code>]</code>
<code> </code><code>Cpu_Cores </code><code>=</code> <code>get_CpuInfo()[</code><code>'Cpu_Cores'</code><code>]</code>
<code> </code><code>Manufacturer, product, sn </code><code>=</code> <code>get_dmidecode()</code>
<code> </code><code>#####[get dict]#####</code>
<code> </code><code>hostinfo </code><code>=</code> <code>{</code>
<code> </code><code>'hostname'</code><code>: hostname,</code>
<code> </code><code>'ip'</code><code>: ip,</code>
<code> </code><code>'osversion'</code><code>: osversion,</code>
<code> </code><code>'memory'</code><code>: memory,</code>
<code> </code><code>'disk'</code><code>: disk,</code>
<code> </code><code>#'vendor_id': Vendor_Id,</code>
<code> </code><code>'model_name'</code><code>: Model_Name,</code>
<code> </code><code>'cpu_core'</code><code>: Cpu_Cores,</code>
<code> </code><code>'product'</code><code>: product,</code>
<code> </code><code>'Manufacturer'</code><code>: Manufacturer,</code>
<code> </code><code>#'sn': sn,</code>
<code> </code><code>}</code>
<code> </code><code>print</code> <code>hostinfo</code>
<code>cat ansible_callback.py</code>
<code># -*- coding:utf8 -*-</code>
<code>'''</code>
<code>Created on 2017年1月13日</code>
<code>ansible 2.2</code>
<code>ssh_args = ""</code>
<code>@author: qiancheng</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>from</code> <code>collections </code><code>import</code> <code>namedtuple</code>
<code>from</code> <code>ansible.inventory </code><code>import</code> <code>Inventory</code>
<code>from</code> <code>ansible.</code><code>vars</code> <code>import</code> <code>VariableManager</code>
<code>from</code> <code>ansible.parsing.dataloader </code><code>import</code> <code>DataLoader</code>
<code>from</code> <code>ansible.executor.playbook_executor </code><code>import</code> <code>PlaybookExecutor</code>
<code>from</code> <code>ansible.plugins.callback </code><code>import</code> <code>CallbackBase</code>
<code>from</code> <code>ansible.errors </code><code>import</code> <code>AnsibleParserError</code>
<code>class</code> <code>mycallback(CallbackBase):</code>
<code> </code><code># 這裡是狀态回調,各種成功失敗的狀态,裡面的各種方法其實都是從寫于CallbackBase父類裡面的,其實還有很多,可以根據需要拿出來用</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>, </code><code>*</code><code>args):</code>
<code> </code><code>super</code><code>(mycallback, </code><code>self</code><code>).__init__(display</code><code>=</code><code>None</code><code>)</code>
<code> </code><code>self</code><code>.status_ok </code><code>=</code> <code>json.dumps({})</code>
<code> </code><code>self</code><code>.status_fail </code><code>=</code> <code>json.dumps({})</code>
<code> </code><code>self</code><code>.status_unreachable </code><code>=</code> <code>json.dumps({})</code>
<code> </code><code>self</code><code>.status_playbook </code><code>=</code> <code>''</code>
<code> </code><code>self</code><code>.status_no_hosts </code><code>=</code> <code>False</code>
<code> </code><code>self</code><code>.host_ok </code><code>=</code> <code>{}</code>
<code> </code><code>self</code><code>.host_failed </code><code>=</code> <code>{}</code>
<code> </code><code>self</code><code>.host_unreachable </code><code>=</code> <code>{}</code>
<code> </code><code>def</code> <code>v2_runner_on_ok(</code><code>self</code><code>, result):</code>
<code> </code><code>host </code><code>=</code> <code>result._host.get_name()</code>
<code> </code><code>self</code><code>.runner_on_ok(host, result._result)</code>
<code> </code><code># self.status_ok=json.dumps({host:result._result},indent=4)</code>
<code> </code><code>self</code><code>.host_ok[host] </code><code>=</code> <code>result</code>
<code> </code><code>def</code> <code>v2_runner_on_failed(</code><code>self</code><code>, result, ignore_errors</code><code>=</code><code>False</code><code>):</code>
<code> </code><code>self</code><code>.runner_on_failed(host, result._result, ignore_errors)</code>
<code> </code><code># self.status_fail=json.dumps({host:result._result},indent=4)</code>
<code> </code><code>self</code><code>.host_failed[host] </code><code>=</code> <code>result</code>
<code> </code><code>def</code> <code>v2_runner_on_unreachable(</code><code>self</code><code>, result):</code>
<code> </code><code>self</code><code>.runner_on_unreachable(host, result._result)</code>
<code> </code><code># self.status_unreachable=json.dumps({host:result._result},indent=4)</code>
<code> </code><code>self</code><code>.host_unreachable[host] </code><code>=</code> <code>result</code>
<code> </code><code>def</code> <code>v2_playbook_on_no_hosts_matched(</code><code>self</code><code>):</code>
<code> </code><code>self</code><code>.playbook_on_no_hosts_matched()</code>
<code> </code><code>self</code><code>.status_no_hosts </code><code>=</code> <code>True</code>
<code> </code><code>def</code> <code>v2_playbook_on_play_start(</code><code>self</code><code>, play):</code>
<code> </code><code>self</code><code>.playbook_on_play_start(play.name)</code>
<code> </code><code>self</code><code>.playbook_path </code><code>=</code> <code>play.name</code>
<code>class</code> <code>my_ansible_play():</code>
<code> </code><code># 這裡是ansible運作</code>
<code> </code><code># 初始化各項參數,大部分都定義好,隻有幾個參數是必須要傳入的</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>, playbook, extra_vars</code><code>=</code><code>{},</code>
<code> </code><code>host_list</code><code>=</code><code>'/etc/ansible/hosts'</code><code>,</code>
<code> </code><code>connection</code><code>=</code><code>'ssh'</code><code>,</code>
<code> </code><code>become</code><code>=</code><code>False</code><code>,</code>
<code> </code><code>become_user</code><code>=</code><code>None</code><code>,</code>
<code> </code><code>module_path</code><code>=</code><code>None</code><code>,</code>
<code> </code><code>fork</code><code>=</code><code>50</code><code>,</code>
<code> </code><code>ansible_cfg</code><code>=</code><code>None</code><code>, </code><code># os.environ["ANSIBLE_CONFIG"] = None</code>
<code> </code><code>passwords</code><code>=</code><code>{},</code>
<code> </code><code>check</code><code>=</code><code>False</code><code>):</code>
<code> </code><code>self</code><code>.playbook_path </code><code>=</code> <code>playbook</code>
<code> </code><code>self</code><code>.passwords </code><code>=</code> <code>passwords</code>
<code> </code><code>self</code><code>.extra_vars </code><code>=</code> <code>extra_vars</code>
<code> </code><code>Options </code><code>=</code> <code>namedtuple(</code><code>'Options'</code><code>,</code>
<code> </code><code>[</code><code>'listtags'</code><code>, </code><code>'listtasks'</code><code>, </code><code>'listhosts'</code><code>, </code><code>'syntax'</code><code>, </code><code>'connection'</code><code>, </code><code>'module_path'</code><code>,</code>
<code> </code><code>'forks'</code><code>, </code><code>'private_key_file'</code><code>, </code><code>'ssh_common_args'</code><code>, </code><code>'ssh_extra_args'</code><code>, </code><code>'sftp_extra_args'</code><code>,</code>
<code> </code><code>'scp_extra_args'</code><code>, </code><code>'become'</code><code>, </code><code>'become_method'</code><code>, </code><code>'become_user'</code><code>, </code><code>'verbosity'</code><code>, </code><code>'check'</code><code>])</code>
<code> </code><code>self</code><code>.options </code><code>=</code> <code>Options(listtags</code><code>=</code><code>False</code><code>, listtasks</code><code>=</code><code>False</code><code>,</code>
<code> </code><code>listhosts</code><code>=</code><code>False</code><code>, syntax</code><code>=</code><code>False</code><code>,</code>
<code> </code><code>connection</code><code>=</code><code>connection, module_path</code><code>=</code><code>module_path,</code>
<code> </code><code>forks</code><code>=</code><code>fork, private_key_file</code><code>=</code><code>None</code><code>,</code>
<code> </code><code>ssh_common_args</code><code>=</code><code>None</code><code>, ssh_extra_args</code><code>=</code><code>None</code><code>,</code>
<code> </code><code>sftp_extra_args</code><code>=</code><code>None</code><code>, scp_extra_args</code><code>=</code><code>None</code><code>,</code>
<code> </code><code>become</code><code>=</code><code>become, become_method</code><code>=</code><code>None</code><code>,</code>
<code> </code><code>become_user</code><code>=</code><code>become_user,</code>
<code> </code><code>verbosity</code><code>=</code><code>None</code><code>, check</code><code>=</code><code>check)</code>
<code> </code><code>if</code> <code>ansible_cfg !</code><code>=</code> <code>None</code><code>:</code>
<code> </code><code>os.environ[</code><code>"ANSIBLE_CONFIG"</code><code>] </code><code>=</code> <code>ansible_cfg</code>
<code> </code><code>self</code><code>.variable_manager </code><code>=</code> <code>VariableManager()</code>
<code> </code><code>self</code><code>.loader </code><code>=</code> <code>DataLoader()</code>
<code> </code><code>self</code><code>.inventory </code><code>=</code> <code>Inventory(loader</code><code>=</code><code>self</code><code>.loader, variable_manager</code><code>=</code><code>self</code><code>.variable_manager, host_list</code><code>=</code><code>host_list)</code>
<code> </code><code># 定義運作的方法和傳回值</code>
<code> </code><code>def</code> <code>run(</code><code>self</code><code>):</code>
<code> </code><code>complex_msg </code><code>=</code> <code>{}</code>
<code> </code><code>if</code> <code>not</code> <code>os.path.exists(</code><code>self</code><code>.playbook_path):</code>
<code> </code><code>code </code><code>=</code> <code>1000</code>
<code> </code><code>results </code><code>=</code> <code>{</code><code>'playbook'</code><code>: </code><code>self</code><code>.playbook_path, </code><code>'msg'</code><code>: </code><code>self</code><code>.playbook_path </code><code>+</code> <code>' playbook is not exist'</code><code>,</code>
<code> </code><code>'flag'</code><code>: </code><code>False</code><code>}</code>
<code> </code><code># results=self.playbook_path+'playbook is not existed'</code>
<code> </code><code># return code,complex_msg,results</code>
<code> </code><code>pbex </code><code>=</code> <code>PlaybookExecutor(playbooks</code><code>=</code><code>[</code><code>self</code><code>.playbook_path],</code>
<code> </code><code>inventory</code><code>=</code><code>self</code><code>.inventory,</code>
<code> </code><code>variable_manager</code><code>=</code><code>self</code><code>.variable_manager,</code>
<code> </code><code>loader</code><code>=</code><code>self</code><code>.loader,</code>
<code> </code><code>options</code><code>=</code><code>self</code><code>.options,</code>
<code> </code><code>passwords</code><code>=</code><code>self</code><code>.passwords)</code>
<code> </code><code>self</code><code>.results_callback </code><code>=</code> <code>mycallback()</code>
<code> </code><code>pbex._tqm._stdout_callback </code><code>=</code> <code>self</code><code>.results_callback</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>code </code><code>=</code> <code>pbex.run()</code>
<code> </code><code>except</code> <code>AnsibleParserError:</code>
<code> </code><code>code </code><code>=</code> <code>1001</code>
<code> </code><code>results </code><code>=</code> <code>{</code><code>'playbook'</code><code>: </code><code>self</code><code>.playbook_path, </code><code>'msg'</code><code>: </code><code>self</code><code>.playbook_path </code><code>+</code> <code>' playbook have syntax error'</code><code>,</code>
<code> </code><code># results='syntax error in '+self.playbook_path #文法錯誤</code>
<code> </code><code>return</code> <code>code, results</code>
<code> </code><code>if</code> <code>self</code><code>.results_callback.status_no_hosts:</code>
<code> </code><code>code </code><code>=</code> <code>1002</code>
<code> </code><code>results </code><code>=</code> <code>{</code><code>'playbook'</code><code>: </code><code>self</code><code>.playbook_path, </code><code>'msg'</code><code>: </code><code>self</code><code>.results_callback.status_no_hosts, </code><code>'flag'</code><code>: </code><code>False</code><code>,</code>
<code> </code><code>'executed'</code><code>: </code><code>False</code><code>}</code>
<code> </code><code># results='no host match in '+self.playbook_path</code>
<code> </code><code>def</code> <code>get_result(</code><code>self</code><code>):</code>
<code> </code><code>self</code><code>.result_all </code><code>=</code> <code>{</code><code>'success'</code><code>: {}, </code><code>'fail'</code><code>: {}, </code><code>'unreachable'</code><code>: {}}</code>
<code> </code><code># print result_all</code>
<code> </code><code># print dir(self.results_callback)</code>
<code> </code><code>for</code> <code>host, result </code><code>in</code> <code>self</code><code>.results_callback.host_ok.items():</code>
<code> </code><code>self</code><code>.result_all[</code><code>'success'</code><code>][host] </code><code>=</code> <code>result._result</code>
<code> </code><code>for</code> <code>host, result </code><code>in</code> <code>self</code><code>.results_callback.host_failed.items():</code>
<code> </code><code>self</code><code>.result_all[</code><code>'failed'</code><code>][host] </code><code>=</code> <code>result._result[</code><code>'msg'</code><code>]</code>
<code> </code><code># print result._result['msg']</code>
<code> </code><code>for</code> <code>host, result </code><code>in</code> <code>self</code><code>.results_callback.host_unreachable.items():</code>
<code> </code><code>self</code><code>.result_all[</code><code>'unreachable'</code><code>][host] </code><code>=</code> <code>result._result[</code><code>'msg'</code><code>]</code>
<code> </code><code>return</code> <code>self</code><code>.result_all[</code><code>'success'</code><code>]</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>#這裡自己修改位址</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>,dict_temps):</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>dict_temps.keys():</code>
<code> </code><code>dict_temp </code><code>=</code> <code>dict_temps[i][</code><code>'stdout'</code><code>]</code>
<code> </code><code>ipdict </code><code>=</code> <code>eval</code><code>(dict_temp.encode(</code><code>"utf-8"</code><code>))</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> </code><code>'''</code>
<code> </code><code>for i in self.result_all['success'].keys():</code>
<code> </code><code>#print i, self.result_all['success'][i]</code>
<code> </code><code>return self.result_all['success'][i]['stdout']</code>
<code> </code><code>#print self.result_all['fail']</code>
<code> </code><code>#print self.result_all['unreachable']</code>
<code> </code><code>play_book </code><code>=</code> <code>my_ansible_play(</code><code>'/home/python/main.yml'</code><code>)</code>
<code> </code><code>play_book.run()</code>
<code> </code><code>dict_temps </code><code>=</code> <code>play_book.get_result()</code>
<code> </code><code>db </code><code>=</code> <code>DB()</code>
<code> </code><code>db.insert_hosts(dict_temps)</code>
這樣就實作通過ansible執行腳本,然後擷取用戶端的結果,再把它插入到資料庫中。這個主要是擷取硬體資訊
效果圖
本文轉自 liqius 51CTO部落格,原文連結:http://blog.51cto.com/szgb17/2049634,如需轉載請自行聯系原作者