#!/usr/bin/env python3 import argparse import subprocess import os import datetime def run_ansible_playbook(inventory, playbook, modes, limit=None, password_file=None, verbose=0, skip_tests=False): start_time = datetime.datetime.now().isoformat() print(f"\n▶️ Script started at: {start_time}\n") print("\n🛠️ Building project (make build)...\n") subprocess.run(["make", "build"], check=True) if not skip_tests: print("\n🧪 Running tests (make test)...\n") subprocess.run(["make", "test"], check=True) cmd = ["ansible-playbook", "-i", inventory, playbook] if limit: cmd.extend(["--limit", limit]) for key, value in modes.items(): val = str(value).lower() if isinstance(value, bool) else str(value) cmd.extend(["-e", f"{key}={val}"]) if password_file: cmd.extend(["--vault-password-file", password_file]) else: cmd.extend(["--ask-vault-pass"]) if verbose: cmd.append("-" + "v" * verbose) print("\n🚀 Launching Ansible Playbook...\n") subprocess.run(cmd, check=True) end_time = datetime.datetime.now().isoformat() print(f"\n✅ Script ended at: {end_time}\n") def main(): script_dir = os.path.dirname(os.path.realpath(__file__)) parser = argparse.ArgumentParser(description="Run Ansible Playbooks") parser.add_argument("inventory", help="Path to the inventory file") parser.add_argument("--limit", help="Limit execution to a specific server") parser.add_argument("--host-type", choices=["server", "personal-computer"], default="server") parser.add_argument("--reset", action="store_true") parser.add_argument("--test", action="store_true") parser.add_argument("--update", action="store_true") parser.add_argument("--backup", action="store_true") parser.add_argument("--cleanup", action="store_true") parser.add_argument("--debug", action="store_true") parser.add_argument("--password-file") parser.add_argument("--skip-tests", action="store_true") parser.add_argument("-v", "--verbose", action="count", default=0) args = parser.parse_args() modes = { "mode_reset": args.reset, "mode_test": args.test, "mode_update": args.update, "mode_backup": args.backup, "mode_cleanup": args.cleanup, "enable_debug": args.debug, "host_type": args.host_type } playbook_file = os.path.join(os.path.dirname(script_dir), "playbook.yml") run_ansible_playbook( inventory=args.inventory, playbook=playbook_file, modes=modes, limit=args.limit, password_file=args.password_file, verbose=args.verbose, skip_tests=args.skip_tests ) if __name__ == "__main__": main()