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
|
# vim: expandtab:tabstop=4:shiftwidth=4
import subprocess
import os
import json
import re
class AnsibleUtil(object):
def __init__(self):
self.host_type_aliases = {
'legacy-openshift-broker': ['broker', 'ex-srv'],
'openshift-node': ['node', 'ex-node'],
'openshift-messagebus': ['msg'],
'openshift-customer-database': ['mongo'],
'openshift-website-proxy': ['proxy'],
'openshift-community-website': ['drupal'],
'package-mirror': ['mirror'],
}
self.alias_lookup = {}
for key, values in self.host_type_aliases.iteritems():
for value in values:
self.alias_lookup[value] = key
self.file_path = os.path.join(os.path.dirname(os.path.realpath(__file__)))
self.multi_ec2_path = os.path.realpath(os.path.join(self.file_path, '..','inventory','multi_ec2.py'))
def get_inventory(self,args=[]):
cmd = [self.multi_ec2_path]
if args:
cmd.extend(args)
env = os.environ
p = subprocess.Popen(cmd, stderr=subprocess.PIPE,
stdout=subprocess.PIPE, env=env)
out,err = p.communicate()
if p.returncode != 0:
raise RuntimeError(err)
return json.loads(out.strip())
def get_environments(self):
pattern = re.compile(r'^tag_environment_(.*)')
envs = []
inv = self.get_inventory()
for key in inv.keys():
m = pattern.match(key)
if m:
envs.append(m.group(1))
envs.sort()
return envs
def get_host_types(self):
pattern = re.compile(r'^tag_host-type_(.*)')
host_types = []
inv = self.get_inventory()
for key in inv.keys():
m = pattern.match(key)
if m:
host_types.append(m.group(1))
host_types.sort()
return host_types
def get_security_groups(self):
pattern = re.compile(r'^security_group_(.*)')
groups = []
inv = self.get_inventory()
for key in inv.keys():
m = pattern.match(key)
if m:
groups.append(m.group(1))
groups.sort()
return groups
def build_host_dict_by_env(self, args=[]):
inv = self.get_inventory(args)
inst_by_env = {}
for dns, host in inv['_meta']['hostvars'].items():
if host['ec2_tag_environment'] not in inst_by_env:
inst_by_env[host['ec2_tag_environment']] = {}
host_id = "%s:%s" % (host['ec2_tag_Name'],host['ec2_id'])
inst_by_env[host['ec2_tag_environment']][host_id] = host
return inst_by_env
# Display host_types
def print_host_types(self):
host_types = self.get_host_types()
ht_format_str = "%35s"
alias_format_str = "%-20s"
combined_format_str = ht_format_str + " " + alias_format_str
print
print combined_format_str % ('Host Types', 'Aliases')
print combined_format_str % ('----------', '-------')
for ht in host_types:
aliases = []
if ht in self.host_type_aliases:
aliases = self.host_type_aliases[ht]
print combined_format_str % (ht, ", ".join(aliases))
else:
print ht_format_str % ht
print
# Convert host-type aliases to real a host-type
def resolve_host_type(self, host_type):
if self.alias_lookup.has_key(host_type):
return self.alias_lookup[host_type]
return host_type
def gen_env_host_type_tag(self, host_type, env):
"""Generate the environment host type tag
"""
host_type = self.resolve_host_type(host_type)
return "tag_env-host-type_%s-%s" % (env, host_type)
def get_host_list(self, host_type, env):
"""Get the list of hosts from the inventory using host-type and environment
"""
inv = self.get_inventory()
host_type_tag = self.gen_env_host_type_tag(host_type, env)
return inv[host_type_tag]
|