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()