Ansible-Playbook kann nicht gegen EC2-Host ausgeführt werden, SSH über Terminal funktioniert einwandfrei

Ansible-Playbook kann nicht gegen EC2-Host ausgeführt werden, SSH über Terminal funktioniert einwandfrei

Ich habe eine EC2-Instanz mit offenem Port 22 erstellt und kann mit dem privaten Schlüssel von meinem Terminal aus eine Verbindung zu dieser Instanz herstellen. Allerdings gelingt mir die Verbindung nicht, wenn ich Ansible-Playbook ausprobiere. Ich habe dynamisches Inventar verwendet.

Der Befehl, den ich für SSH verwende und der auch erfolgreich ist (ich führe den folgenden Befehl aus, in dem der private Schlüssel abgelegt wird):

ssh -i "test-key.pem" [email protected]

Inhalte für das Playbook:

---
- name: Hello World example
  hosts: all
  become: true

  tasks:
    - name: Printing Hello World
      debug:
          msg: "Hello World"

Der Befehl, den ich ausgeführt habe:

ansible-playbook -i ec2.py --private-key /home/testuser/.ssh/test-key.pem -l instance_id playbook-hello.yml

sogar ich habe es versucht mit:

ansible-playbook -i ec2.py --private-key /home/testuser/.ssh/test-key.pem -l instance_id -e 'ansible_ssh_user=ubuntu' playbook-hello.yml

Fehler:

fatal: [x.x.x.x]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host x.x.x.x port 22: Operation timed out\r\n", "unreachable": true}

Andere Details:

Ich verwende Ansible-Playbooks auf meinem MacBook Pro. Die EC2-Instanz läuft unter Ubuntu OS 18.04.

Wenn ich ./ec2.py ausführe, kann ich sehen, dass meine Instanz gedruckt wird. AWS-Schlüssel werden im Stammverzeichnis im Ordner .aws/credentials gespeichert.

PS: Diese Frage könnte ein Duplikat anderer verfügbarer Fragen sein, ich habe jedoch keine positiven Erkenntnisse gewonnen, die zu meinem Fall passen.

Antwort1

Ich habe es falsch verstanden, dass das verwendete ec2.py-Skript nur Instanzen mit privaten IPs zurückgab. Aus diesem Grund konnte keine Verbindung zur Instanz auf Port 22 hergestellt werden.

Als ich jedoch SSH verwendete, nutzte ich eine öffentliche IP oder einen DNS-Namen.

Anstatt ec2.py zu verwenden, habe ich das Skript mit der öffentlichen IP ausgeführt:

ansible-playbook -i a.b.c.d, playbook-hello-world.yml

abcd – ist eine öffentliche IP einer Instanz.

Falls bei jemandem zufällig die folgende Fehlermeldung auftritt:

TASK [Gathering Facts] ***************************************************************************************************************************************
fatal: [a.b.c.d]: FAILED! => {"changed": false, "module_stderr": "Shared connection to a.b.c.d closed.\r\n", "module_stdout": "/bin/sh: 1: /usr/local/bin/python3: not found\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 127}

Bitte verwenden Sie den folgenden Befehl:

ansible-playbook -i a.b.c.d, -e 'ansible_python_interpreter=/usr/bin/python3' playbook-hello-world.yml

Stellen Sie einfach sicher, dass Python3 im angegebenen Pfad der Instanz installiert ist, auf der Sie versuchen, das Playbook auszuführen.

verwandte Informationen