Ansible playbook 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 playbook au lieu d'utiliser --key-file
sur la ligne de commande?
Parce que je veux écrire l'emplacement de cette clé dans un fichier var.yaml
, qui sera lu par ansible playbook avec 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 ça ne marche 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 lance ansible-playbook
avec le playbook.yml
ci-dessus. J'ai eu 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 de clé dans la commande ssh. C'est étrange.
Le nom de la variable que vous recherchez est ansible_ssh_private_key_file
.
Vous devriez le définir au niveau '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
:
# hosts_vars/myHost.yml
ansible_ssh_private_key_file: ~/.ssh/mykey1.pem
# hosts_vars/myOtherHost.yml
ansible_ssh_private_key_file: ~/.ssh/mykey2.pem
dans un fichier group_vars
si vous utilisez la même clé pour un groupe d'hôtes
dans la section vars
de votre jeu EDIT: cette solution ne peut fonctionner car il est trop tard pour définir la variable.
- 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
Vous pouvez utiliser le fichier ansible.cfg. Il devrait ressembler à ceci:
[defaults]
inventory: <YOUR INVENTORY>
remote_user = <YOUR USER>
private_key_file = <PATH TO KEY_FILE>
J'espère que cela vous évite de taper
Si vous exécutez votre livre de lecture avec ansible-playbook -vvv
, la commande en cours d'exécution sera affichée. Vous pourrez ainsi vérifier si la clé est réellement incluse dans la commande ssh (et vous découvrirez peut-être que le problème est un mauvais nom d'utilisateur plutôt que la clé manquante). .
Je suis d'accord avec le commentaire de Brian ci-dessus (et celui de zigam) selon lequel la section vars est trop tardive. J'ai aussi testé l'inclusion de la clé dans la définition à la volée de l'hôte comme celle-ci.
# 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.
Donc, ce n'est pas une réponse. Juste une aide de débogage et des choses à ne pas essayer.