web-dev-qa-db-fra.com

Comment générer des clés Host SSH via ansible?

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  
11
Server Fault

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.

14
Zoredache

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 ...

6
Michael Hampton

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
2
Jorj

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 ""
1
MaxiReglisse

@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
1
David Weber

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 }}"
1
HeroFromEarth

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
0
MUY Belgium