天天看點

ansible 1.7.2 api 擷取有某些應用的ip

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

<code> </code> 

<code>""</code><code>" Check Zookeeper Cluster</code>

<code>zookeeper version should be newer than 3.4.x</code>

<code># echo mntr|nc 127.0.0.1 2181</code>

<code>zk_version  3.4.6-1569965, built on 02</code><code>/20/2014</code> <code>09:09 GMT</code>

<code>zk_avg_latency  0</code>

<code>zk_max_latency  4</code>

<code>zk_min_latency  0</code>

<code>zk_packets_received 84467</code>

<code>zk_packets_sent 84466</code>

<code>zk_num_alive_connections    3</code>

<code>zk_outstanding_requests 0</code>

<code>zk_server_state follower</code>

<code>zk_znode_count  17159</code>

<code>zk_watch_count  2</code>

<code>zk_ephemerals_count 1</code>

<code>zk_approximate_data_size    6666471</code>

<code>zk_open_file_descriptor_count   29</code>

<code>zk_max_file_descriptor_count    102400</code>

<code># echo ruok|nc 127.0.0.1 2181</code>

<code>imok</code>

<code>""</code><code>"</code>

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

<code>import</code> <code>socket</code>

<code>import</code> <code>re</code>

<code>import</code> <code>subprocess</code>

<code>from StringIO </code><code>import</code> <code>StringIO</code>

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

<code>zabbix_sender = </code><code>'/opt/app/zabbix/sbin/zabbix_sender'</code>

<code>zabbix_conf = </code><code>'/opt/app/zabbix/conf/zabbix_agentd.conf'</code>

<code>send_to_zabbix = 1</code>

<code>############# get zookeeper server status</code>

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

<code>    </code><code>def __init__(self, host=</code><code>'localhost'</code><code>, port=</code><code>'2181'</code><code>, timeout=1):</code>

<code>        </code><code>self._address = (host, int(port))</code>

<code>        </code><code>self._timeout = timeout</code>

<code>        </code><code>self._result  = {}</code>

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

<code>        </code><code>return</code> <code>socket.socket()</code>

<code>    </code><code>def _send_cmd(self, cmd):</code>

<code>        </code><code>""</code><code>" Send a 4letter word command to the server "</code><code>""</code>

<code>        </code><code>s = self._create_socket()</code>

<code>        </code><code>s.settimeout(self._timeout)</code>

<code>        </code><code>s.connect(self._address)</code>

<code>        </code><code>s.send(cmd)</code>

<code>        </code><code>data = s.recv(2048)</code>

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

<code>        </code><code>return</code> <code>data</code>

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

<code>        </code><code>""</code><code>" Get ZooKeeper server stats as a map "</code><code>""</code>

<code>        </code><code>data_mntr = self._send_cmd(</code><code>'mntr'</code><code>)</code>

<code>        </code><code>data_ruok = self._send_cmd(</code><code>'ruok'</code><code>)</code>

<code>        </code><code>if</code> <code>data_mntr:</code>

<code>            </code><code>result_mntr = self._parse(data_mntr)</code>

<code>        </code><code>if</code> <code>data_ruok:</code>

<code>            </code><code>result_ruok = self._parse_ruok(data_ruok)</code>

<code>        </code><code>self._result = dict(result_mntr.items() + result_ruok.items())</code>

<code>         </code> 

<code>        </code><code>if</code> <code>not self._result.has_key(</code><code>'zk_followers'</code><code>) and not self._result.has_key(</code><code>'zk_synced_followers'</code><code>) and not self._result.has_key(</code><code>'zk_pending_syncs'</code><code>):</code>

<code>           </code><code>##### the tree metrics only exposed on leader role zookeeper server, we just set the followers' to 0</code>

<code>           </code><code>leader_only = {</code><code>'zk_followers'</code><code>:0,</code><code>'zk_synced_followers'</code><code>:0,</code><code>'zk_pending_syncs'</code><code>:0}    </code>

<code>           </code><code>self._result = dict(result_mntr.items() + result_ruok.items() + leader_only.items() )</code>

<code>        </code><code>return</code> <code>self._result  </code>

<code>    </code><code>def _parse(self, data):</code>

<code>        </code><code>""</code><code>" Parse the output from the 'mntr' 4letter word command "</code><code>""</code>

<code>        </code><code>h = StringIO(data)</code>

<code>        </code><code>result = {}</code>

<code>        </code><code>for</code> <code>line </code><code>in</code> <code>h.readlines():</code>

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

<code>                </code><code>key, value = self._parse_line(line)</code>

<code>                </code><code>result[key] = value</code>

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

<code>                </code><code>pass </code><code># ignore broken lines</code>

<code>        </code><code>return</code> <code>result</code>

<code>    </code><code>def _parse_ruok(self, data):</code>

<code>        </code><code>""</code><code>" Parse the output from the 'ruok' 4letter word command "</code><code>""</code>

<code>        </code> 

<code>        </code><code>ruok = h.readline()</code>

<code>        </code><code>if</code> <code>ruok:</code>

<code>           </code><code>result[</code><code>'zk_server_ruok'</code><code>] = ruok</code>

<code>  </code> 

<code>    </code><code>def _parse_line(self, line):</code>

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

<code>            </code><code>key, value = map(str.strip, line.</code><code>split</code><code>(</code><code>'\t'</code><code>))</code>

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

<code>            </code><code>raise ValueError(</code><code>'Found invalid line: %s'</code> <code>% line)</code>

<code>        </code><code>if</code> <code>not key:</code>

<code>            </code><code>raise ValueError(</code><code>'The key is mandatory and should not be empty'</code><code>)</code>

<code>            </code><code>value = int(value)</code>

<code>        </code><code>except (TypeError, ValueError):</code>

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

<code>        </code><code>return</code> <code>key, value</code>

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

<code>#  ps -ef|grep java|grep zookeeper|awk '{print $2}'</code>

<code>         </code><code>pidarg = </code><code>''</code><code>'ps -ef|grep java|grep zookeeper|grep -v grep|awk '</code><code>{print $2}</code><code>' '</code><code>''</code> 

<code>         </code><code>pidout = subprocess.Popen(pidarg,shell=True,stdout=subprocess.PIPE)</code>

<code>         </code><code>pid = pidout.stdout.readline().strip(</code><code>'\n'</code><code>)</code>

<code>         </code><code>return</code> <code>pid</code>

<code>    </code><code>def send_to_zabbix(self, metric):</code>

<code>         </code><code>key = </code><code>"zookeeper.status["</code> <code>+  metric + </code><code>"]"</code>

<code>         </code><code>if</code> <code>send_to_zabbix &gt; 0:</code>

<code>             </code><code>#print key + ":" + str(self._result[metric])</code>

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

<code>                </code><code>subprocess.call([zabbix_sender, </code><code>"-c"</code><code>, zabbix_conf, </code><code>"-k"</code><code>, key, </code><code>"-o"</code><code>, str(self._result[metric]) ], stdout=FNULL, stderr=FNULL, shell=False)</code>

<code>             </code><code>except OSError, detail:</code>

<code>                </code><code>print </code><code>"Something went wrong while exectuting zabbix_sender : "</code><code>, detail</code>

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

<code>                </code><code>print </code><code>"Simulation: the following command would be execucted :\n"</code><code>, zabbix_sender, </code><code>"-c"</code><code>, zabbix_conf, </code><code>"-k"</code><code>, key, </code><code>"-o"</code><code>, self._result[metric], </code><code>"\n"</code>

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

<code>        </code><code>""</code><code>"Display program usage"</code><code>""</code>

<code>        </code><code>print </code><code>"\nUsage : "</code><code>, sys.argv[0], </code><code>" alive|all"</code>

<code>        </code><code>print </code><code>"Modes : \n\talive : Return pid of running zookeeper\n\tall : Send zookeeper stats as well"</code>

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

<code>accepted_modes = [</code><code>'alive'</code><code>, </code><code>'all'</code><code>]</code>

<code>if</code> <code>len(sys.argv) == 2 and sys.argv[1] </code><code>in</code> <code>accepted_modes:</code>

<code>        </code><code>mode = sys.argv[1]</code>

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

<code>        </code><code>usage()</code>

<code>zk = ZooKeeperServer()</code>

<code>#  print zk.get_stats()</code>

<code>pid = zk.get_pid()</code>

<code>if</code> <code>pid != </code><code>""</code> <code>and  mode == </code><code>'all'</code><code>:</code>

<code>   </code><code>zk.get_stats()</code>

<code>   </code><code># print zk._result</code>

<code>   </code><code>FNULL = </code><code>open</code><code>(os.devnull, </code><code>'w'</code><code>)</code>

<code>   </code><code>for</code> <code>key </code><code>in</code> <code>zk._result:</code>

<code>       </code><code>zk.send_to_zabbix(key)</code>

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

<code>   </code><code>print pid</code>

<code>elif</code> <code>pid != </code><code>""</code> <code>and mode == </code><code>"alive"</code><code>:</code>

<code>    </code><code>print pid</code>

<code>    </code><code>print 0</code>

我對比上面搞了自己的

<code>1.</code><code>cat</code> <code>qa_servers.txt </code>

<code>[dev]</code>

<code>t8 ansible_ssh_user=root ansible_ssh_host=xx</code>

<code>[cs]</code>

<code>t7 ansible_ssh_user=root ansible_ssh_host=xx</code>

<code>2.</code><code>cat</code> <code>test</code><code>.sh</code>

<code>#!/bin/bash</code>

<code>if</code> <code>[ `</code><code>ps</code> <code>-ef|</code><code>grep</code> <code>tomcat|</code><code>grep</code> <code>/opt</code><code>|</code><code>wc</code> <code>-l` -gt 0 ];</code><code>then</code>

<code>echo</code> <code>`</code><code>ifconfig</code><code>|</code><code>grep</code> <code>'inet '</code><code>|</code><code>grep</code> <code>-</code><code>v</code> <code>'127.0'</code><code>|</code><code>xargs</code><code>|</code><code>awk</code> <code>-F </code><code>'[ :]'</code> <code>'{print $3}'</code><code>`</code>

<code>fi</code>

<code>3.</code><code>cat</code> <code>test</code><code>.sh</code>

<code>[root@jk home]</code><code># cat test.py</code>

<code>import</code> <code>ansible.runner</code>

<code>from ansible.color </code><code>import</code> <code>stringc</code>

<code>import</code> <code>subprocess </code>

<code>host_list=</code><code>'qa_servers.txt'</code>

<code>private_key_file=</code><code>'/root/.ssh/id_rsa'</code>

<code>pattern=</code><code>'*'</code>

<code>forks=10</code>

<code>timeout=30</code>

<code>module_name=</code><code>'script'</code>

<code>module_args=</code><code>'test.sh'</code>

<code># construct the ansible runner and execute on all hosts</code>

<code>results = ansible.runner.Runner(</code>

<code>host_list=host_list,</code>

<code>private_key_file=private_key_file,</code>

<code>pattern=pattern,</code>

<code>forks=forks,</code>

<code>timeout=timeout,</code>

<code>module_name=module_name,</code>

<code>module_args=module_args</code>

<code>                               </code><code>).run()</code>

<code>#print results</code>

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

<code>   </code><code>print </code><code>"No hosts found"</code>

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

<code>print results</code>

<code>for</code> <code>(</code><code>hostname</code><code>, result) </code><code>in</code> <code>results[</code><code>'contacted'</code><code>].items():</code>

<code>    </code><code>if</code> <code>not </code><code>'failed'</code> <code>in</code> <code>result:</code>

<code>        </code><code>ip=result[</code><code>'stdout'</code><code>].strip()</code>

<code>        </code><code>if</code> <code>ip != </code><code>""</code> <code>:</code>

<code>                   </code><code>output=</code><code>open</code><code>(</code><code>'/home/ip.txt'</code><code>,</code><code>'a'</code><code>)</code>

<code>                   </code><code>output.write(ip)  </code>

<code>                   </code><code>output.write(</code><code>'\n'</code><code>)</code>

<code>4.運作 python </code><code>test</code><code>.py</code>

<code>驗證 </code><code>cat</code> <code>/home/ip</code><code>.txt</code>

<code>簡單來說,就是處理ansible的輸出</code>

<code></code>

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