ansible 1.7.2 api 获取有某些应用的ip

范例 参考http://john88wang.blog.51cto.com/2165294/1745339

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#!/usr/bin/python
  
  
""" Check Zookeeper Cluster
  
zookeeper version should be newer than 3.4.x
  
# echo mntr|nc 127.0.0.1 2181
zk_version  3.4.6-1569965, built on 02/20/2014 09:09 GMT
zk_avg_latency  0
zk_max_latency  4
zk_min_latency  0
zk_packets_received 84467
zk_packets_sent 84466
zk_num_alive_connections    3
zk_outstanding_requests 0
zk_server_state follower
zk_znode_count  17159
zk_watch_count  2
zk_ephemerals_count 1
zk_approximate_data_size    6666471
zk_open_file_descriptor_count   29
zk_max_file_descriptor_count    102400
  
# echo ruok|nc 127.0.0.1 2181
imok
  
"""
  
import sys
import socket
import re
import subprocess
from StringIO import StringIO
import os
  
  
zabbix_sender = '/opt/app/zabbix/sbin/zabbix_sender'
zabbix_conf = '/opt/app/zabbix/conf/zabbix_agentd.conf'
send_to_zabbix = 1
  
  
  
############# get zookeeper server status
class ZooKeeperServer(object):
  
    def __init__(self, host='localhost', port='2181', timeout=1):
        self._address = (host, int(port))
        self._timeout = timeout
        self._result  = {}
  
    def _create_socket(self):
        return socket.socket()
  
  
    def _send_cmd(self, cmd):
        """ Send a 4letter word command to the server """
        s = self._create_socket()
        s.settimeout(self._timeout)
  
        s.connect(self._address)
        s.send(cmd)
  
        data = s.recv(2048)
        s.close()
  
        return data
  
    def get_stats(self):
        """ Get ZooKeeper server stats as a map """
        data_mntr = self._send_cmd('mntr')
        data_ruok = self._send_cmd('ruok')
        if data_mntr:
            result_mntr = self._parse(data_mntr)
        if data_ruok:
            result_ruok = self._parse_ruok(data_ruok)
  
        self._result = dict(result_mntr.items() + result_ruok.items())
          
        if not self._result.has_key('zk_followers') and not self._result.has_key('zk_synced_followers') and not self._result.has_key('zk_pending_syncs'):
  
           ##### the tree metrics only exposed on leader role zookeeper server, we just set the followers' to 0
           leader_only = {'zk_followers':0,'zk_synced_followers':0,'zk_pending_syncs':0}    
           self._result = dict(result_mntr.items() + result_ruok.items() + leader_only.items() )
  
        return self._result  
  
  
  
    def _parse(self, data):
        """ Parse the output from the 'mntr' 4letter word command """
        h = StringIO(data)
          
        result = {}
        for line in h.readlines():
            try:
                key, value = self._parse_line(line)
                result[key] = value
            except ValueError:
                pass # ignore broken lines
  
        return result
  
    def _parse_ruok(self, data):
        """ Parse the output from the 'ruok' 4letter word command """
         
        h = StringIO(data)
         
        result = {}
         
        ruok = h.readline()
        if ruok:
           result['zk_server_ruok'] = ruok
   
        return result
   
  
  
    def _parse_line(self, line):
        try:
            key, value = map(str.strip, line.split('\t'))
        except ValueError:
            raise ValueError('Found invalid line: %s' % line)
  
        if not key:
            raise ValueError('The key is mandatory and should not be empty')
  
        try:
            value = int(value)
        except (TypeError, ValueError):
            pass
  
        return key, value
  
  
  
    def get_pid(self):
#  ps -ef|grep java|grep zookeeper|awk '{print $2}'
         pidarg = '''ps -ef|grep java|grep zookeeper|grep -v grep|awk '{print $2}' ''' 
         pidout = subprocess.Popen(pidarg,shell=True,stdout=subprocess.PIPE)
         pid = pidout.stdout.readline().strip('\n')
         return pid
  
  
    def send_to_zabbix(self, metric):
         key = "zookeeper.status[" +  metric + "]"
  
         if send_to_zabbix > 0:
             #print key + ":" + str(self._result[metric])
             try:
  
                subprocess.call([zabbix_sender, "-c", zabbix_conf, "-k", key, "-o", str(self._result[metric]) ], stdout=FNULL, stderr=FNULL, shell=False)
             except OSError, detail:
                print "Something went wrong while exectuting zabbix_sender : ", detail
         else:
                print "Simulation: the following command would be execucted :\n", zabbix_sender, "-c", zabbix_conf, "-k", key, "-o", self._result[metric], "\n"
  
  
  
  
def usage():
        """Display program usage"""
  
        print "\nUsage : ", sys.argv[0], " alive|all"
        print "Modes : \n\talive : Return pid of running zookeeper\n\tall : Send zookeeper stats as well"
        sys.exit(1)
  
  
  
accepted_modes = ['alive''all']
  
if len(sys.argv) == 2 and sys.argv[1] in accepted_modes:
        mode = sys.argv[1]
else:
        usage()
  
  
  
  
zk = ZooKeeperServer()
#  print zk.get_stats()
pid = zk.get_pid()
  
if pid != "" and  mode == 'all':
   zk.get_stats()
   # print zk._result
   FNULL = open(os.devnull, 'w')
   for key in zk._result:
       zk.send_to_zabbix(key)
   FNULL.close()
   print pid
  
elif pid != "" and mode == "alive":
    print pid
else:
    print 0

我对比上面搞了自己的

1
2
3
4
5
1.cat qa_servers.txt 
[dev]
t8 ansible_ssh_user=root ansible_ssh_host=xx
[cs]
t7 ansible_ssh_user=root ansible_ssh_host=xx
1
2
3
4
5
2.cat test.sh
#!/bin/bash
if [ `ps -ef|grep tomcat|grep /opt|wc -l` -gt 0 ];then
echo `ifconfig|grep 'inet '|grep -v '127.0'|xargs|awk -F '[ :]' '{print $3}'`
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
3.cat test.sh
#!/bin/bash
if [ `ps -ef|grep tomcat|grep /opt|wc -l` -gt 0 ];then
echo `ifconfig|grep 'inet '|grep -v '127.0'|xargs|awk -F '[ :]' '{print $3}'`
fi
[root@jk home]# cat test.py
import ansible.runner
from ansible.color import stringc
import sys
import socket
import re
import subprocess 
 
host_list='qa_servers.txt'
private_key_file='/root/.ssh/id_rsa'
pattern='*'
forks=10
timeout=30
module_name='script'
module_args='test.sh'
# construct the ansible runner and execute on all hosts
results = ansible.runner.Runner(
host_list=host_list,
private_key_file=private_key_file,
pattern=pattern,
forks=forks,
timeout=timeout,
module_name=module_name,
module_args=module_args
                               ).run()
#print results
if results is None:
   print "No hosts found"
   sys.exit(1)
print results
for (hostname, result) in results['contacted'].items():
    if not 'failed' in result:
        ip=result['stdout'].strip()
        if ip != "" :
                   output=open('/home/ip.txt','a')
                   output.write(ip)  
                   output.write('\n')
1
2
3
4.运行 python test.py
验证 cat /home/ip.txt
简单来说,就是处理ansible的输出




本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1812500,如需转载请自行联系原作者
上一篇:解决SQL单用户模式不能转为多用户模式


下一篇:java中文乱码解决之道(七)—–JSP页面编码过程