web-dev-qa-db-fra.com

ansible: exécute local_action une seule fois lors de l'exécution de playbook sur un groupe d'hôtes (plusieurs hôtes gérés)

Est-il possible dans ansible de faire exécuter la tâche local_action UNIQUEMENT une fois lors de l'exécution de playbook sur un groupe d'hôtes?

Voici le problème:

hosts:
    - macbooks
    - localhost
tasks:

#...<some_remote_tasks>...#

    - local_action: command
        ssh-keygen -o -a 100 -t ed25519 -f {{ ssh_key }} -q -N ''
      become: yes

Résultat:

fatal: [laptop -> localhost]: FAILED! => {"changed": true, "cmd": ["ssh-keygen", "-o", "-a", "100", "-t", "ed25519", "-f", "/etc/ssh/id_ed25519-HostCA", "-q", "-N", "", "-C", "SSH Host Certificate Authority for cypherpunk.synology.me"], "delta": "0:00:00.014818", "end": "2018-06-01 17:02:41.599111", "msg": "non-zero return code", "rc": 1, "start": "2018-06-01 17:02:41.584293", "stderr": "", "stderr_lines": [], "stdout": "/etc/ssh/id_ed25519-HostCA already exists.\nOverwrite (y/n)? ", "stdout_lines": ["/etc/ssh/id_ed25519-HostCA already exists.", "Overwrite (y/n)? "]}
changed: [localhost -> localhost] 

Et cela a du sens, car chaque tâche d’un playbook doit être exécutée pour chaque hôte géré.

Mais comme il s'agit d'une action locale, la première fois que le fichier de clé est créé est exécutée comme prévu. La deuxième fois que le fichier existe déjà et que ansible obtient une erreur: "/etc/ssh/id_ed25519-HostCA already exists. Overwrite (y/n)?" avec return code 1. Donc, vraiment, il ne doit être exécuté qu’une seule fois (du moins dans cette situation).

Je pourrais faire quelque chose comme:

- local_action: Shell >
         [[ ! -f {{ ssh_key }} ]] && \
         ssh-keygen -o -a 100 -t ed25519 -f {{ ssh_key }} -q -N ''; \
         exit 0
      become: yes

Mais je me demande s’il existe une solution recommandée par ansible? Comment allez-vous résoudre ce problème?

4
Drew

Peut-être devriez-vous vérifier: run_once & delegate_to

- command: /opt/application/upgrade_db.py
  run_once: true
  delegate_to: web01.example.org

Doc: https://docs.ansible.com/ansible/latest/user_guide/playbooks_delegation.html

Sincères amitiés,

C

3
Canna