Selbst wenn die Portnummer unterschiedlich ist, kommt es zu Fehlfunktionen, wenn der Hostname identisch ist.
Anstatt die IP direkt in die Inventardatei zu schreiben, geben Sie "host1 ansible_ssh_host = 127.0.0.1" an, damit der Hostname nicht abgedeckt wird.
main.yml
- name: sync source code
synchronize:>
dest=/var/ma2saka/myapp
src=/Users/ma2saka/ansible/work/myapp/
recursive=yes
links=yes
rsync_opts="--exclude='.git'"
inventory.ini
[dev]
127.0.0.1
[dev:vars]
ansible_ssh_user=vagrant
ansible_ssh_port=2222
Der von Vagrant eingerichtete Server wartet am lokalen 2222.
Der öffentliche Schlüssel wird im Voraus wie folgt registriert.
ssh-add -D
ssh-add ~/.ssh/id_rsa
ssh-copy-id -p 2222 [email protected]
TASK: [deploy | sync source code] *********************************************
failed: [127.0.0.1 -> 127.0.0.1] => {"cmd": "rsync --delay-updates -FF --compress --archive --rsh 'ssh -S none -o StrictHostKeyChecking=no -o Port=2222' --exclude='.git' --out-format='<<CHANGED>>%i %n%L' \"/Users/ma2saka/ansible/work/myapp/\" \"/var/ma2saka/myapp\"", "failed": true, "rc": 23}
msg: rsync: change_dir "/Users/ma2saka/ansible/work/myapp/" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1039) [sender=3.0.6]
FATAL: all hosts have already failed -- aborting
Nein, auch wenn Sie "msg: rsync: change_dir" / Users / ma2saka / ansible / work / myapp / "sagen: fehlgeschlagen: Keine solche Datei oder kein solches Verzeichnis (2)". Weil es dieses Verzeichnis gibt. Egal wie du es betrachtest.
In 1.9.1 gibt es keine besonderen Änderungen.
inventory.ini
[dev]
myapp1.amazon.example.com
myapp2.amazon.example.com
myapp3.amazon.example.com
[dev:vars]
ansible_ssh_user=ec2-user
ansible_ssh_port=22
Es funktioniert wie erwartet ohne Probleme.
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
127.0.0.1 this.is.it
inventory.ini
[dev]
this.is.it
[dev:vars]
ansible_ssh_user=vagrant
ansible_ssh_port=2222
Wenn Sie es damit ausführen.
..Abkürzung..
TASK: [deploy | sync source code] *********************************************
changed: [this.is.it -> 127.0.0.1]
..Abkürzung..
Es klappt ... Dies funktioniert wie erwartet, ist also in Ordnung, aber es gibt noch einige Dinge, die nicht überraschend sind.
Wenn Sie die IP nicht angeben können, warum verwenden Sie nicht localhost?
TASK: [deploy | sync source code] *********************************************
failed: [localhost -> 127.0.0.1] => {"cmd": "rsync --delay-updates -FF --compress --archive --rsh 'ssh -S none -o StrictHostKeyChecking=no -o Port=2222' --exclude='.git' --out-format='<<CHANGED>>%i %n%L' \"/Users/ma2saka/ansible/work/myapp/\" \"/var/ma2saka/myapp\"", "failed": true, "rc": 12}
msg: ssh: connect to host localhost port 2222: Connection refused
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6]
Gut.
Mit anderen Worten, in Wirklichkeit ist der "Name" des Hosts das Problem?
Es war genau dieses Phänomen, das aufgefangen wurde.
Wenn Sie eine Verbindung mit ansible zu einem Host herstellen, der auf dem lokalen Host eine Portweiterleitung durchführt, empfiehlt es sich, einen geeigneten Alias in der Inventardatei anzugeben.
[dev]
# lvh.ich oder das.is.Du musst es nicht schreiben
host1 ansible_ssh_host=127.0.0.1
[dev:vars]
ansible_ssh_user=vagrant
ansible_ssh_port=2222
Ich habe auch den Code des Synchronisierungsmoduls und des Skripts überprüft, das zur Laufzeit übertragen wurde, damit ich das Verhalten verstanden habe, aber dies ist eine Falle. Meistens ist die Fehlermeldung zu unfreundlich. Während ich mich beschwere. Es fühlt sich gut an, weil es gelöst wurde.
Wenn Sie sich -vvvv
genau ansehen, können Sie sehen," wo das Skript ausgeführt wird ". Als ich 127.0.0.1 schrieb und fehlschlug, wurde das Skript tatsächlich auf einem Remote-Server ausgeführt. Das Verzeichnis kann jedoch nicht gefunden werden, da der relative Pfad des lokalen Computers in der Quellenspezifikation geschrieben ist.
Als ich das bemerkte, hätte ich sofort ahnen können, dass dies kein Fehler in einem bestimmten Modul war, sondern die Logik zur Auflösung des Hostnamens von ansible, aber ich verbrachte Zeit damit, den falsch platzierten Teil zu verfolgen. Es ist ziemlich schwierig.
Recommended Posts