Ansible Playbook kann den Schlüssel für die SSH-Verbindung mit --key-file
in der Befehlszeile angeben.
ansible-playbook -i hosts playbook.yml --key-file "~/.ssh/mykey.pem"
Kann der Speicherort dieses Schlüssels in der Playbook-Datei angegeben werden, anstatt --key-file
in der Befehlszeile zu verwenden?
Weil ich den Ort dieses Schlüssels in eine var.yaml
-Datei schreiben möchte, die von ansible playbook mit vars_files:
gelesen wird.
Folgendes ist Teil meiner Konfiguration:
datei vars.yml
key1: ~/.ssh/mykey1.pem
key2: ~/.ssh/mykey2.pem
playbook.yml-Datei
---
- hosts: myHost
remote_user: ubuntu
key_file: {{ key1 }} # This is not a valid syntax in ansible. Does there exist this kind of directive which allows me to specify the ssh key used for this connection?
vars_files:
- vars.yml
tasks:
- name: Echo a hello message
command: echo hello
Ich habe versucht, ansible_ssh_private_key_file
unter vars
hinzuzufügen. Aber es funktioniert nicht auf meiner Maschine.
vars_files:
- vars.yml
vars:
ansible_ssh_private_key_file: "{{ key1 }}"
tasks:
- name: Echo a hello message
command: echo hello
Wenn ich ansible-playbook
mit dem obigen playbook.yml
starte. Ich habe folgenden Fehler erhalten:
TASK [Gathering Facts] ******************************************************************************************************************************
Using module file /usr/local/lib/python2.7/site-packages/ansible/modules/system/setup.py
<192.168.5.100> ESTABLISH SSH CONNECTION FOR USER: ubuntu
<192.168.5.100> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ubuntu -o ConnectTimeout=10 -o ControlPath=/Users/myName/.ansible/cp/2d18691789 192.168.5.100 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
<192.168.5.100> (255, '', 'Permission denied (publickey).\r\n')
fatal: [192.168.5.100]: UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the Host via ssh: Permission denied (publickey).\r\n",
"unreachable": true
}
to retry, use: --limit @/Users/myName/playbook.retry
Ich finde den Namen meiner Schlüsseldatei nicht im Befehl ssh. Es ist komisch.
Der Variablenname, nach dem Sie suchen, ist ansible_ssh_private_key_file
.
Sie sollten es auf 'vars' setzen:
in der Inventardatei:
myHost ansible_ssh_private_key_file=~/.ssh/mykey1.pem
myOtherHost ansible_ssh_private_key_file=~/.ssh/mykey2.pem
im Host_vars
:
# hosts_vars/myHost.yml
ansible_ssh_private_key_file: ~/.ssh/mykey1.pem
# hosts_vars/myOtherHost.yml
ansible_ssh_private_key_file: ~/.ssh/mykey2.pem
in einer group_vars
-Datei, wenn Sie denselben Schlüssel für eine Gruppe von Hosts verwenden
in der vars
-Sektion Ihres Spiels EDIT: Diese Lösung kann nicht funktionieren, da die Definition der Variablen zu spät ist.
- hosts: myHost
remote_user: ubuntu
vars_files:
- vars.yml
vars:
ansible_ssh_private_key_file: "{{ key1 }}"
tasks:
- name: Echo a hello message
command: echo hello
Sie können die Datei ansible.cfg verwenden. Die Datei sollte folgendermaßen aussehen (es gibt andere Parameter, die Sie möglicherweise hinzufügen möchten):
[defaults]
inventory: <YOUR INVENTORY>
remote_user = <YOUR USER>
private_key_file = <PATH TO KEY_FILE>
Ich hoffe, das erspart Ihnen etwas Tippen
Wenn Sie Ihr Playbook mit ansible-playbook -vvv
ausführen, wird der aktuelle Befehl ausgeführt. Sie können also prüfen, ob der Schlüssel tatsächlich im Befehl ssh enthalten ist (und möglicherweise feststellen, dass das Problem nicht der fehlende, sondern der falsche Benutzername war.) .
Ich stimme mit Brians Kommentar (und Zigams Bearbeitung) überein, dass der Abschnitt vars zu spät ist. Ich habe auch getestet, den Schlüssel in die fliegende Definition des Hosts wie folgt aufzunehmen
# fails
- name: Add all instance public IPs to Host group
add_Host: hostname={{ item.public_ip }} groups=ec2hosts ansible_ssh_private_key_file=~/.aws/dev_staging.pem
loop: "{{ ec2.instances }}"
aber das scheitert auch.
Das ist also keine Antwort. Nur einige Debugging-Hilfen und Dinge, die nicht versucht werden sollten.