J'essaie de recréer des clés d'hôte ssh sur une poignée de serveurs distants via ansible (et ssh-keygen
), mais les fichiers ne semblent pas apparaître. Le playbook fonctionne correctement, mais les fichiers de la télécommande ne sont pas modifiés.
Je dois recourir au echo -e
piratage puisque ces télécommandes exécutent Ubuntu 14.04 et n'ont pas la version correcte de python-pexpect
disponible (selon ansible).
Qu'est-ce que je rate? Mon playbook et ma sortie sont ci-dessous:
playbook
---
- hosts: all
become: true
gather_facts: false
tasks:
- name: Generate /etc/ssh/ RSA Host key
command : echo -e 'y\n'|ssh-keygen -q -t rsa -f /etc/ssh/ssh_Host_rsa_key -C "" -N ""
register: output
- debug: var=output.stdout_lines
- name: Generate /etc/ssh/ DSA Host key
command : echo -e 'y\n'|ssh-keygen -q -t dsa -f /etc/ssh/ssh_Host_dsa_key -C "" -N ""
register: output
- debug: var=output.stdout_lines
- name: Generate /etc/ssh/ ECDSA Host key
command : echo -e 'y\n'|ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_Host_ecdsa_key -C "" -N ""
register: output
- debug: var=output.stdout_lines
sortie
$ ansible-playbook ./playbooks/ssh-hostkeys.yml -l myhost.mydom.com,
Sudo password:
PLAY [all] **********************************************************************************************
TASK [Generate /etc/ssh/ RSA Host key] ******************************************************************
changed: [myhost.mydom.com]
TASK [debug] ********************************************************************************************
ok: [myhost.mydom.com] => {
"output.stdout_lines": [
"y",
"|ssh-keygen -q -t rsa -f /etc/ssh/ssh_Host_rsa_key -C -N "
]
}
TASK [Generate /etc/ssh/ DSA Host key] ******************************************************************
changed: [myhost.mydom.com]
TASK [debug] ********************************************************************************************
ok: [myhost.mydom.com] => {
"output.stdout_lines": [
"y",
"|ssh-keygen -q -t dsa -f /etc/ssh/ssh_Host_dsa_key -C -N "
]
}
TASK [Generate /etc/ssh/ ECDSA Host key] ****************************************************************
changed: [myhost.mydom.com]
TASK [debug] ********************************************************************************************
ok: [myhost.mydom.com] => {
"output.stdout_lines": [
"y",
"|ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_Host_ecdsa_key -C -N "
]
}
PLAY RECAP **********************************************************************************************
myhost.mydom.com : ok=6 changed=3 unreachable=0 failed=0
Pour autant que je sache, la seule raison pour laquelle vous auriez besoin de diriger un "y" vers ssh-keygen, c'est si votre commande remplace un fichier existant. À mon avis, ce n'est pas un bon moyen de faire quelque chose à partir d'un outil de gestion de configuration.
Vous devez ajuster vos tâches pour les rendre idempotentes. Plus précisément, si vous ajoutez le creates: filename
à votre commande, les nouvelles clés ne seront créées que lorsqu'elles n'existent pas déjà, au lieu d'être remplacées à chaque fois que vous exécutez ce playbook.
---
- hosts: all
become: true
gather_facts: false
tasks:
- name: Generate /etc/ssh/ RSA Host key
command : ssh-keygen -q -t rsa -f /etc/ssh/ssh_Host_rsa_key -C "" -N ""
args:
creates: /etc/ssh/ssh_Host_rsa_key
- name: Generate /etc/ssh/ DSA Host key
command : ssh-keygen -q -t dsa -f /etc/ssh/ssh_Host_dsa_key -C "" -N ""
args:
creates: /etc/ssh/ssh_Host_dsa_key
- name: Generate /etc/ssh/ ECDSA Host key
command : ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_Host_ecdsa_key -C "" -N ""
args:
creates: /etc/ssh/ssh_Host_ecdsa_key
Si, pour une raison quelconque, vous vouliez remplacer ces clés, par exemple, si elles étaient trop anciennes ou si vous souhaitez ajouter une autre tâche pour les supprimer. Voici une simple suppression
- file:
state: absent:
path: "{{item}}"
loop:
- /etc/ssh/ssh_Host_rsa_key
- /etc/ssh/ssh_Host_dsa_key
- /etc/ssh/ssh_Host_ecdsa_key
Si vous souhaitez supprimer des fichiers générés avant une certaine heure, vous pouvez utiliser le module stat pour récupérer des détails sur ces fichiers et configurer des conditions when
pour les supprimer de manière sélective si elles étaient antérieures à une certaine date ou quelque chose.
Le module ansible command
ne transmet pas de commandes via un shell . Cela signifie que vous ne pouvez pas utiliser les opérateurs Shell tels que le tuyau, et c'est pourquoi vous voyez le symbole du tuyau dans la sortie. En ce qui concerne ansible, il a exécuté la commande echo
avec tout le reste de la ligne comme arguments pour echo
.
Si vous avez besoin de la ligne de commande traitée par un shell, tilisez Shell
au lieu de command
.
Et, il devrait y avoir un meilleur moyen de régénérer les clés d'hôte ssh, mais je ne peux pas en trouver une pour le moment ...
Utilisez le module spécial pour cette tâche:
- name: Generate an OpenSSH keypair with the default values (4096 bits, rsa)
openssh_keypair:
path: /home/youruser/.ssh/id_rsa
owner: youruser
group: youruser
- name: Fix owner of the generated pub key
file:
path: /home/youruser/.ssh/id_rsa.pub
owner: youruser
group: youruser
désolé, mais je ne pouvais pas utiliser "crée" dans une tâche. j'ai obtenu l'erreur suivante:
ERROR! 'creates' is not a valid attribute for a Task
par conséquent, j'utilise les tâches suivantes:
- name: remove existing ssh_Host keys
file: path={{ item }} state=absent
with_items:
- "/etc/ssh/ssh_Host_rsa_key"
- "/etc/ssh/ssh_Host_dsa_key"
- "/etc/ssh/ssh_Host_ecdsa_key"
- name: Generate /etc/ssh/ RSA Host key
command : ssh-keygen -q -t rsa -f /etc/ssh/ssh_Host_rsa_key -C "" -N ""
- name: Generate /etc/ssh/ DSA Host key
command : ssh-keygen -q -t dsa -f /etc/ssh/ssh_Host_dsa_key -C "" -N ""
- name: Generate /etc/ssh/ ECDSA Host key
command : ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_Host_ecdsa_key -C "" -N ""
@Zoredache a la bonne réponse mais elle échoue (notée par @MaxiReglisse) pour les versions récentes d'Ansible. Utilisez plutôt le code suivant:
---
- hosts: all
become: true
gather_facts: false
tasks:
- name: Generate /etc/ssh/ RSA Host key
command : ssh-keygen -q -t rsa -f /etc/ssh/ssh_Host_rsa_key -C "" -N ""
args:
creates: /etc/ssh/ssh_Host_rsa_key
Une autre option consiste à utiliser le module tilisateur. Le côté positif est que vous aurez une tâche idempotente. Voici un exemple comment générer des clés ssh sur localhost:
- name: Generate ssh keys
local_action:
module: "user"
name: "{{ lookup('env','USER') }}"
generate_ssh_key: true
ssh_key_type: "{{ item.0 }}"
ssh_key_bits: "{{ item.1 }}"
ssh_key_file: "{{ playbook_dir }}/{{ item.0 }}_{{ item.1 }}_key"
with_together:
- [ 'rsa', 'dsa' ]
- [ 2048, 1024 ]
loop_control:
label: "{{ item.0 }}_{{ item.1 }}_key"
- name: Copy generated ssh keys to remote machine
copy:
src: "{{ playbook_dir }}/{{ item.0 }}_{{ item.1 }}_key"
dest: "/etc/ssh/ssh_Host_{{ item.0 }}_key{{ item.1 }}"
with_nested:
- [ 'rsa', 'dsa' ]
- [ '', '.pub' ]
notify:
- Restart sshd
loop_control:
label: "/etc/ssh/ssh_Host_{{ item.0 }}_key{{ item.1 }}"
Utilisez les modules openssh_keypair et authorized_key pour créer et déployer les clés en même temps sans les enregistrer dans votre hôte ansible.
- openssh_keypair:
group: root
owner: root
path: /some/path/in/your/server
register: ssh_key
- name: Store public key into Origin
delegate_to: central_server_name
authorized_key:
key: "{{ssh_key.public_key}}"
comment: "{{ansible_hostname}}"
user: any_user_on_central