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