これは、説明自体でさえ、トリッキーな理論上の質問です。
ここでは、わかりやすくするために、例としてBacula
(サーバーバックアップソフトウェア)を使用します。
Baculaにはサーバーとクライアントコンポーネントがあります。新しいクライアントを追加するには、サーバーとクライアントに構成ファイルが必要です。ですから、私の役割でやりたいことは次のとおりです。
Baculaサーバーの役割:
今私が抱えている問題はHost_vars
とgroup_vars
にあります。この役割をすべての[debian]
ホスト(これはグループです)で使用できるようにしたいと思います。したがって、私のプレイブックは次のようになります。
- hosts: debian
roles:
- bacula
tags:
- bacula
したがって、このロールがトリガーされると、次のことを実行する必要があります。
debian-client
):構成をdebian-client
にコピーしますdebian-client
):構成をdebian-server
にコピーしますどうすればそれができるのでしょうか?
私にとっては説明が難しいので、不明な点がありましたらお知らせください。わかりやすくさせていただきます。
更新:
@KonstantinSuvorovに感謝しますdelegate_to
はそれに答えました: https://docs.ansible.com/ansible/playbooks_delegation.html#delegation
たとえば、次のようなものです。
在庫:
[debian]
Host1
Host2
Host3 bacula_role=server
Host4
Host5
演奏する:
- hosts: debian
vars:
bacula_server: "{{ (ansible_play_hosts | map('extract',hostvars) | selectattr('bacula_role','defined') | selectattr('bacula_role','equalto','server') | first).inventory_hostname }}"
tasks:
- debug: msg="Install server"
when: inventory_hostname == bacula_server
# client block
- block:
- debug: msg="Template server-side client config"
delegate_to: bacula_server
- debug: msg="Template client config"
when: inventory_hostname != bacula_server
# end of block
debug
ステートメントを実際のモジュール(例:apt
/template
)に置き換え、bacula_role=server
のホストが存在しない場合はエラー処理を追加します。
サーバー/クライアントをインストールするタスクが多数ある場合は、when
ステートメントなしでbacula_server.yml
とbacula_client.yml
に分割できますが、次のものを含めてください。
- include: "bacula_{{ bacula_role | default('client') }}.yml"