import paramiko, time ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('140.44.4.11', username='root', key_filename=r'C:\Users\Snarf\.ssh\id_ed25519_snarfnet', timeout=10) py_code = """ from awx.main.models import Project, JobTemplate, Job, Host import time # 0. Clean up homeassistant from inventory Host.objects.filter(name='homeassistant').delete() print("Inventory hosts count:", Host.objects.count()) # 1. Update project p = Project.objects.get(name='Snarfnet Infrastructure Playbooks') update = p.update() print(f"Triggered project update [{update.id}]...") # Wait for project update for _ in range(15): update.refresh_from_db() if update.status in ['successful', 'failed', 'error']: break time.sleep(2) print(f"Project update [{update.id}] finished: Status={update.status}") if update.status != 'successful': print("Project update failed! Aborting.") exit(1) # 2. Launch Job Template jt = JobTemplate.objects.get(name='Daily Drift & Agent Health Audit') job = jt.create_unified_job() job.signal_start() print(f"Launched Job [{job.id}] for '{jt.name}': Status={job.status}") # 3. Poll for completion for _ in range(50): job.refresh_from_db() if job.status in ['successful', 'failed', 'error', 'canceled']: break time.sleep(3) print(f"Job [{job.id}] finished with Status={job.status}, Elapsed={job.elapsed}s, Failed={job.failed}") # 4. Print events / recap print("\n=== PLAY RECAP ===") for e in job.job_events.filter(event='playbook_on_stats'): print(e.stdout) """ cmd = f"kubectl exec -i -n awx -c awx-task deployment/awx-task -- awx-manage shell_plus --quiet << 'EOF'\n{py_code}\nEOF" stdin, stdout, stderr = ssh.exec_command(cmd) for line in iter(stdout.readline, ""): print(line, end="") ssh.close()