import paramiko 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, Inventory, Credential, JobTemplate # 1. Update Project p = Project.objects.get(name='Snarfnet Infrastructure Playbooks') update = p.update() print(f"Triggered Project update [{update.id}]") inv = Inventory.objects.get(name='Snarfnet Master Inventory') cred_root = Credential.objects.get(name='Snarfnet Master SSH Key (root)') # 2. Register Job Template jt, created = JobTemplate.objects.get_or_create( name='Aerodrome K3s Control Plane Upgrade', defaults={ 'project': p, 'inventory': inv, 'playbook': 'ansible/playbooks/upgrade_k3s_aerodrome.yml', 'ask_variables_on_launch': True, 'description': 'Sequential minor release upgrade of Aerodrome K3s control plane with etcd quorum check' } ) if not created: jt.playbook = 'ansible/playbooks/upgrade_k3s_aerodrome.yml' jt.ask_variables_on_launch = True jt.save() jt.credentials.add(cred_root) print(f"Job Template '{jt.name}' (id={jt.id}, created={created}) registered.") """ 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) print(stdout.read().decode()) ssh.close()