Angabe des SSH-Schlüssels in der Ansible-Playbook-Datei

79

Ansible Playbook kann den für die SSH-Verbindung verwendeten Schlüssel --key-filein der Befehlszeile angeben .

ansible-playbook -i hosts playbook.yml --key-file "~/.ssh/mykey.pem"

Ist es möglich, den Speicherort dieses Schlüssels in der Playbook-Datei anzugeben, anstatt ihn in der --key-fileBefehlszeile zu verwenden?

Weil ich den Speicherort dieses Schlüssels in eine var.yamlDatei schreiben möchte, die von ansible playbook mit gelesen wird vars_files:.

Folgendes ist Teil meiner Konfiguration:

vars.yml Datei

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_fileunter hinzuzufügen vars. Aber auf meiner Maschine funktioniert es nicht.

vars_files:
  - vars.yml
vars:
  ansible_ssh_private_key_file: "{{ key1 }}"
tasks:
  - name: Echo a hello message
    command: echo hello

Wenn ich ansible-playbookmit dem playbook.ymloben genannten renne. 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.

Brian
quelle
1
Ich denke --private-key=~/.ssh/keys/id_rsawird funktionieren.
zx1986
@ zx1986 --private-key key_file_pathhat auch bei mir funktioniert.
Kaustubh Desai

Antworten:

89

Der gesuchte Variablenname lautet ansible_ssh_private_key_file.

Sie sollten es auf 'vars'-Ebene einstellen:

  • in der Inventardatei:

    myHost ansible_ssh_private_key_file=~/.ssh/mykey1.pem
    myOtherHost ansible_ssh_private_key_file=~/.ssh/mykey2.pem
    
  • in der 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_varsDatei, wenn Sie denselben Schlüssel für eine Gruppe von Hosts verwenden

  • im varsAbschnitt Ihres Spiels:

    - 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
    

Inventardokumentation

Zigarn
quelle
2
Das Schreiben ansible_ssh_private_key_fileunter varsfunktioniert auf meinem Computer nicht. Es ist komisch.
Brian
Ich möchte den Schlüssel nicht im Inventar angeben. Weil ich nicht vars.ymlaus der Inventardatei laden kann.
Brian
Genau: Von dem ist varses einfach zu spät, denke ich. Sie sollten dann host_varsoder group_varsDateien verwenden, wenn Sie dies nicht in Ihr Inventar aufnehmen möchten.
Zigarn
Es wäre interessant zu sehen, wie sich der private Schlüssel in einem Tresor befindet, damit der private Schlüssel in das Git-Repo geschoben werden kann, ohne sich so schlecht zu fühlen.
Ferdy
@fabiog Sie haben Recht, ich habe es gerade mit Ansible 2.9 bis 1.8 getestet und alle (Haupt-) Versionen funktionieren mit dem im vars:Abschnitt definierten privaten Schlüssel .
Zigarn
30

Sie können die Datei ansible.cfg verwenden. Sie sollte folgendermaßen aussehen (es gibt andere Parameter, die Sie möglicherweise einschließen möchten):

[defaults]
inventory = <PATH TO INVENTORY FILE>
remote_user = <YOUR USER>
private_key_file =  <PATH TO KEY_FILE>

Ich hoffe, das erspart Ihnen das Tippen

E.Serra
quelle
0

Wenn Sie Ihr Playbook mit ansible-playbook -vvvausführen, wird der tatsächliche Befehl ausgeführt, sodass Sie überprüfen können, ob der Schlüssel tatsächlich im Befehl ssh enthalten ist (und möglicherweise feststellen, dass das Problem der falsche Benutzername und nicht der fehlende Schlüssel war).

Ich stimme Brians Kommentar oben (und Zigams Bearbeitung) zu, dass der Vars-Abschnitt zu spät ist. Ich habe auch getestet, den Schlüssel in die On-the-Fly-Definition des Hosts 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 ein paar Debugging-Hilfe und Dinge, die man nicht ausprobieren sollte.

Andrew Lorien
quelle