-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathk8s_inventory.py
executable file
·121 lines (107 loc) · 3.69 KB
/
k8s_inventory.py
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
#!/usr/bin/env python
# A simple dynamic replacemant of 'kargo prepare'
# Generates ansible inventory from a list of IPs in 'nodes' file.
import argparse
import json
import os
import yaml
def read_network_metadata_file(filename):
with open(filename, 'r') as f:
content = yaml.load(f)
return content
def read_vars_from_file(src="/root/kargo/inventory/group_vars/all.yml"):
with open(src, 'r') as f:
content = yaml.load(f)
return content
def nodes_to_hash(network_metadata, group_vars):
nodes = {
'all': {
'hosts': [],
'vars': group_vars
},
'etcd': {
'hosts': [],
},
'kube-master': {
'hosts': [],
},
'kube-node': {
'hosts': [],
},
'bird-rr': {
'children': ['kube-master']
},
'bird-node': {
'children': ['kube-node']
},
'k8s-cluster': {
'children': ['kube-node', 'kube-master']
},
'_meta': {
'hostvars': {}
}
}
racks = {}
mn_racks = network_metadata.get('racks', [])
for rack_no in range(1, len(mn_racks)):
racks[rack_no] = {
'hosts': [],
'vars': {
'rack_no': rack_no,
'as_number': mn_racks[rack_no].get('as_number', 65000+rack_no),
'bgpport': mn_racks[rack_no].get('bgpport', 179),
'subnet': mn_racks[rack_no]['subnet'],
'tor': mn_racks[rack_no]['tor']
}
}
#for node_ip in network_metadata:
mn_nodes = network_metadata.get('nodes', {})
for node_name in mn_nodes:
node = mn_nodes[node_name]
node_roles = node.get('node_roles', [])
if 'master' in node_roles:
continue
nodes['all']['hosts'].append(node_name)
nodes['_meta']['hostvars'][node_name] = {
'ansible_ssh_host': node['ipaddr'],
'ip': node['ipaddr'],
'rack_no': node['rack_no'],
'as_number': node['as_number'],
}
nodes['kube-node']['hosts'].append(node_name)
if 'kube_master' in node_roles:
nodes['kube-master']['hosts'].append(node_name)
if 'kube_etcd' in node_roles:
nodes['etcd']['hosts'].append(node_name)
rack_no = int(node.get('rack_no', 1))
racks[rack_no]['hosts'].append(node_name)
nodes['all']['hosts'].sort()
nodes['kube-master']['hosts'].sort()
nodes['kube-node']['hosts'].sort()
nodes['etcd']['hosts'].sort()
for rack_no in racks:
racks[rack_no]['hosts'].sort()
nodes["rack{0}".format(rack_no)] = racks[rack_no]
return nodes
def main():
parser = argparse.ArgumentParser(description='Kargo inventory simulator')
parser.add_argument('--list', action='store_true')
parser.add_argument('--host', default=False)
args = parser.parse_args()
# Read params from ENV since ansible does not support passing args to dynamic inv scripts
if os.environ.get('K8S_NETWORK_METADATA'):
nodes_file = os.environ['K8S_NETWORK_METADATA']
else:
nodes_file = '/etc/network_metadata.yaml'
if os.environ.get('KARGO_GROUP_VARS'):
vars_file = os.environ['KARGO_GROUP_VARS']
else:
vars_file = "/root/kargo/inventory/group_vars/all.yml"
network_metadata = read_network_metadata_file(nodes_file)
nodes = nodes_to_hash(network_metadata, read_vars_from_file(vars_file))
if args.host:
print json.dumps(nodes['_meta']['hostvars'][args.host])
else:
print json.dumps(nodes)
if __name__ == "__main__":
main()