#!/usr/bin/env python3 """ Generate a JSON file listing all Ansible role directories. Usage: python roles_list.py [--roles-dir path/to/roles] [--output path/to/roles/list.json | console] """ import os import json import argparse def find_roles(roles_dir: str): """Return sorted list of role names under roles_dir.""" return sorted([ entry for entry in os.listdir(roles_dir) if os.path.isdir(os.path.join(roles_dir, entry)) ]) def write_roles_list(roles, out_file): """Write the list of roles to out_file as JSON.""" os.makedirs(os.path.dirname(out_file), exist_ok=True) with open(out_file, 'w', encoding='utf-8') as f: json.dump(roles, f, indent=2) print(f"Wrote roles list to {out_file}") def main(): # Determine default roles_dir relative to this script: ../../.. -> roles script_dir = os.path.dirname(os.path.abspath(__file__)) default_roles_dir = os.path.abspath( os.path.join(script_dir, '..', '..', 'roles') ) default_output = os.path.join(default_roles_dir, 'list.json') parser = argparse.ArgumentParser(description='Generate roles/list.json') parser.add_argument( '--roles-dir', '-r', default=default_roles_dir, help=f'Directory containing role subfolders (default: {default_roles_dir})' ) parser.add_argument( '--output', '-o', default=default_output, help=( 'Output path for roles list JSON ' '(or "console" to print to stdout, default: %(default)s)' ) ) args = parser.parse_args() if not os.path.isdir(args.roles_dir): parser.error(f"Roles directory not found: {args.roles_dir}") roles = find_roles(args.roles_dir) if args.output.lower() == 'console': # Print JSON to stdout print(json.dumps(roles, indent=2)) else: write_roles_list(roles, args.output) if __name__ == '__main__': main()