wake-up-neo.com

Festlegen des SSH-Schlüssels in einer lesbaren Playbook-Datei

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.

37
Brian

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
    

Bestandsdokumentation

42
zigarn

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

11
E.Serra

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.

0
andrew lorien