#!/usr/bin/env python3 """ CLI Script: get_role_folder_cli.py This script determines the appropriate Ansible role folder based on the provided application_id by inspecting each role's vars/main.yml within the roles directory. By default, it assumes the roles directory is located at the project root, relative to this script's location. Example: ./get_role_folder_cli.py --application-id my-app-id """ import os import sys import argparse import yaml def get_role_folder(application_id, roles_path): """ Find the role directory under `roles_path` whose vars/main.yml contains the specified application_id. :param application_id: The application_id to match. :param roles_path: Path to the roles directory. :return: The name of the matching role directory. :raises RuntimeError: If no match is found or if an error occurs while reading files. """ if not os.path.isdir(roles_path): raise RuntimeError(f"Roles path not found: {roles_path}") for role in sorted(os.listdir(roles_path)): role_dir = os.path.join(roles_path, role) vars_file = os.path.join(role_dir, 'vars', 'main.yml') if os.path.isfile(vars_file): try: with open(vars_file, 'r') as f: data = yaml.safe_load(f) or {} except Exception as e: raise RuntimeError(f"Failed to load {vars_file}: {e}") if data.get('application_id') == application_id: return role raise RuntimeError(f"No role found with application_id '{application_id}' in {roles_path}") def main(): parser = argparse.ArgumentParser( description='Determine the Ansible role folder by application_id' ) parser.add_argument( 'application_id', help='The application_id defined in vars/main.yml to search for' ) parser.add_argument( '-r', '--roles-path', default=os.path.join( os.path.dirname(os.path.realpath(__file__)), os.pardir, os.pardir, 'roles' ), help='Path to the roles directory (default: roles/ at project root)' ) args = parser.parse_args() try: folder = get_role_folder(args.application_id, args.roles_path) print(folder) sys.exit(0) except RuntimeError as err: print(f"Error: {err}", file=sys.stderr) sys.exit(1) if __name__ == '__main__': main()