156 votes

Spécifier la clé ssh dans le fichier du playbook ansible

Le playbook Ansible peut spécifier la clé utilisée pour la connexion ssh en utilisant --key-file sur la ligne de commande.

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

Est-il possible de spécifier l'emplacement de cette clé dans le fichier du playbook au lieu d'utiliser --key-file en ligne de commande ?

Parce que je veux écrire l'emplacement de cette clé dans un fichier var.yaml qui sera lu par le playbook ansible avec la fonction vars_files: .

Les éléments suivants font partie de ma configuration :

fichier vars.yml

key1: ~/.ssh/mykey1.pem
key2: ~/.ssh/mykey2.pem

fichier playbook.yml

---

- 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

J'ai essayé d'ajouter ansible_ssh_private_key_file sous vars . Mais cela ne fonctionne pas sur ma machine.

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

Si je cours ansible-playbook avec le playbook.yml ci-dessus. J'ai obtenu l'erreur suivante :

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

Je ne trouve pas le nom de mon fichier clé dans la commande ssh. C'est étrange.

4 votes

Je pense --private-key=~/.ssh/keys/id_rsa fonctionnera.

1 votes

@zx1986 --private-key key_file_path a aussi fonctionné pour moi.

183voto

zigarn Points 186

Le nom de la variable que vous recherchez est ansible_ssh_private_key_file .

Vous devez le définir au niveau de "vars" :

  • dans le fichier d'inventaire :

      myHost ansible_ssh_private_key_file=~/.ssh/mykey1.pem
      myOtherHost ansible_ssh_private_key_file=~/.ssh/mykey2.pem
  • dans le host_vars :

      # host_vars/myHost.yml
      ansible_ssh_private_key_file: ~/.ssh/mykey1.pem
    
      # host_vars/myOtherHost.yml
      ansible_ssh_private_key_file: ~/.ssh/mykey2.pem
  • dans un group_vars si vous utilisez la même clé pour un groupe d'hôtes.

  • dans le vars la section de votre pièce :

      - 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

Documentation de l'inventaire

3 votes

Rédaction ansible_ssh_private_key_file sous vars ne fonctionne pas sur ma machine. C'est étrange.

0 votes

Je ne veux pas spécifier la clé dans l'inventaire. Parce que je ne peux pas charger vars.yml du fichier d'inventaire.

1 votes

Exactement : de la vars il est simplement trop tard, je pense. Vous devriez utiliser host_vars ou group_vars des dossiers alors si tu ne veux pas mettre ça dans ton inventaire.

67voto

E.Serra Points 379

Vous pouvez utiliser le fichier ansible.cfg, il devrait ressembler à ceci (Il y a d'autres paramètres que vous pourriez vouloir inclure) :

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

J'espère que cela vous évitera de taper

1 votes

Pour les environnements de laboratoire loufoques avec des configurations et des clés spécifiques à un projet, c'est de loin la meilleure solution.

5voto

andrew lorien Points 813

Si vous exécutez votre playbook avec ansible-playbook -vvv vous verrez la commande en cours d'exécution, ce qui vous permettra de vérifier si la clé est effectivement incluse dans la commande ssh (et vous découvrirez peut-être que le problème venait du mauvais nom d'utilisateur plutôt que de la clé manquante).

Je suis d'accord avec le commentaire de Brian ci-dessus (et l'édition de zigam) que la section vars est trop tardive. J'ai également testé l'inclusion de la clé dans la définition à la volée de l'hôte comme ceci

# 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 }}"

mais cela échoue aussi.

Ce n'est donc pas une réponse. Juste une aide au débogage et des choses à ne pas essayer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X