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