|
Theo Chatzimichos |
e53270 |
#!/usr/bin/python3
|
|
Theo Chatzimichos |
e53270 |
|
|
Theo Chatzimichos |
e53270 |
# For description and usage, see the argparse options at the end of the file
|
|
Theo Chatzimichos |
e53270 |
|
|
Theo Chatzimichos |
698a44 |
from copy import copy
|
|
Theo Chatzimichos |
e53270 |
import argparse
|
|
Theo Chatzimichos |
e53270 |
import yaml
|
|
Theo Chatzimichos |
e53270 |
import os
|
|
Theo Chatzimichos |
e53270 |
|
|
Theo Chatzimichos |
3f50ca |
|
|
Christian Boltz |
25cb76 |
def read_file_skip_jinja(filename):
|
|
Christian Boltz |
25cb76 |
''' reads a file and returns its content, except lines starting with '{%' '''
|
|
Christian Boltz |
25cb76 |
non_jinja_lines = []
|
|
Christian Boltz |
25cb76 |
|
|
Christian Boltz |
25cb76 |
with open(filename) as f:
|
|
Christian Boltz |
25cb76 |
for line in f.read().split('\n'):
|
|
Christian Boltz |
25cb76 |
if not line.startswith('{%'):
|
|
Christian Boltz |
25cb76 |
non_jinja_lines.append(line)
|
|
Christian Boltz |
25cb76 |
|
|
Christian Boltz |
25cb76 |
return '\n'.join(non_jinja_lines)
|
|
Christian Boltz |
25cb76 |
|
|
Theo Chatzimichos |
e53270 |
|
|
Theo Chatzimichos |
4f2316 |
def get_roles_of_one_minion(minion):
|
|
Theo Chatzimichos |
4f2316 |
content = read_file_skip_jinja("pillar/id/%s" % minion)
|
|
Theo Chatzimichos |
274e9c |
try:
|
|
Karol Babioch |
3016f1 |
roles = yaml.safe_load(content)['grains']['roles']
|
|
Theo Chatzimichos |
274e9c |
except KeyError:
|
|
Theo Chatzimichos |
274e9c |
roles = []
|
|
Theo Chatzimichos |
274e9c |
|
|
Theo Chatzimichos |
274e9c |
return roles
|
|
Theo Chatzimichos |
274e9c |
|
|
Theo Chatzimichos |
274e9c |
|
|
Theo Chatzimichos |
3f50ca |
def get_roles(append=[]):
|
|
Theo Chatzimichos |
698a44 |
roles = copy(append)
|
|
Theo Chatzimichos |
e53270 |
|
|
Theo Chatzimichos |
e53270 |
for sls in os.listdir('pillar/id'):
|
|
Theo Chatzimichos |
4f2316 |
_roles = get_roles_of_one_minion(sls)
|
|
Christian Boltz |
25cb76 |
for item in _roles:
|
|
Christian Boltz |
25cb76 |
roles.append(item)
|
|
Theo Chatzimichos |
e53270 |
|
|
Theo Chatzimichos |
e53270 |
roles = sorted(set(roles))
|
|
Theo Chatzimichos |
e53270 |
return roles
|
|
Theo Chatzimichos |
e53270 |
|
|
Theo Chatzimichos |
e53270 |
|
|
Theo Chatzimichos |
e53270 |
def print_roles():
|
|
Theo Chatzimichos |
e53270 |
parser = argparse.ArgumentParser('Collects all the roles that are assigned to a minion, and returns them as a python array, a yaml list or a plain list (parsable by bash)')
|
|
 |
a6ef48 |
parser.add_argument('-o', '--out', choices=['bash', 'python', 'yaml'], help='Select different output format. Options: bash (default), python, yaml')
|
|
Theo Chatzimichos |
3f50ca |
parser.add_argument('-a', '--append', action='append', nargs='+', help='Append a list of given roles at the results.')
|
|
Theo Chatzimichos |
e53270 |
args = parser.parse_args()
|
|
Theo Chatzimichos |
e53270 |
|
|
Theo Chatzimichos |
3f50ca |
appended = []
|
|
Theo Chatzimichos |
3f50ca |
if args.append:
|
|
Theo Chatzimichos |
3f50ca |
for sublist in args.append:
|
|
Theo Chatzimichos |
3f50ca |
for item in sublist:
|
|
Theo Chatzimichos |
3f50ca |
appended.append(item)
|
|
Theo Chatzimichos |
3f50ca |
roles = get_roles(append=appended)
|
|
 |
a6ef48 |
if args.out == 'python':
|
|
Theo Chatzimichos |
e53270 |
print(roles)
|
|
 |
a6ef48 |
elif args.out == 'yaml':
|
|
 |
dc3f8e |
print(yaml.dump({'roles': roles}, default_flow_style=False))
|
|
Theo Chatzimichos |
e53270 |
else:
|
|
Theo Chatzimichos |
053051 |
print('\n'.join(roles))
|
|
Theo Chatzimichos |
e53270 |
|
|
Theo Chatzimichos |
e53270 |
|
|
Theo Chatzimichos |
e53270 |
if __name__ == "__main__":
|
|
Theo Chatzimichos |
e53270 |
print_roles()
|