web-dev-qa-db-ja.com

ansible:ホストのグループ(複数の管理対象ホスト)に対してPlaybookを実行している間、local_actionを1回だけ実行します

ホストのグループに対してプレイブックを実行しているときに、_local_action_タスクを一度だけ実行することをansibleで行うことは可能ですか?

ここに問題があります:

_hosts:
    - macbooks
    - localhost
tasks:

#...<some_remote_tasks>...#

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

結果:

_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] 
_

プレイブックのタスクは、管理対象のホストごとに実行する必要があるため、これは理にかなっています。

ただし、これはローカルアクションであるため、キーファイルの作成時に予想どおりに初めて実行されます。 2回目はファイルが既に存在し、ansibleがエラーを受け取ります:"/etc/ssh/id_ed25519-HostCA already exists. Overwrite (y/n)?" with _return code 1_。したがって、実際には1回だけ実行する必要があります(少なくともこの状況では)。

私は次のようなことをすることができます:

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

しかし、私はansible-recommendedソリューションがあるのだろうか?どうやってこれを解決しますか?

4
Drew

多分あなたはチェックする必要があります:run_once&delegate_to

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

ドキュメント: https://docs.ansible.com/ansible/latest/user_guide/playbooks_delegation.html

敬具、

C

4
Canna