web-dev-qa-db-ja.com

Ansible:構成を現在のホストおよび他のホストにコピーします

これは、説明自体でさえ、トリッキーな理論上の質問です。

ここでは、わかりやすくするために、例としてBacula(サーバーバックアップソフトウェア)を使用します。

Baculaにはサーバーとクライアントコンポーネントがあります。新しいクライアントを追加するには、サーバーとクライアントに構成ファイルが必要です。ですから、私の役割でやりたいことは次のとおりです。

Baculaサーバーの役割:

  1. 1つのホストにBaculaサーバーをセットアップする
  2. [すべてのクライアント用]サーバーのクライアント構成ファイルをサーバーにコピーします
  3. [すべてのクライアント用]クライアントのクライアント構成ファイルをクライアントにコピーします

今私が抱えている問題はHost_varsgroup_varsにあります。この役割をすべての[debian]ホスト(これはグループです)で使用できるようにしたいと思います。したがって、私のプレイブックは次のようになります。

- hosts: debian
  roles:
    - bacula
  tags:
    - bacula

したがって、このロールがトリガーされると、次のことを実行する必要があります。

  1. 1つのホストは明らかにサーバーである必要があるため、サーバーホストで実行された場合、このホストは完全なBaculaサーバープロビジョニングを取得します。
  2. この役割が他のすべてのクライアントに適用される場合、次のことが発生するはずです:
    1. (現在のホストdebian-client):構成をdebian-clientにコピーします
    2. (現在のホストdebian-client):構成をdebian-serverにコピーします

どうすればそれができるのでしょうか?


私にとっては説明が難しいので、不明な点がありましたらお知らせください。わかりやすくさせていただきます。

更新:

@KonstantinSuvorovに感謝しますdelegate_toはそれに答えました: https://docs.ansible.com/ansible/playbooks_delegation.html#delegation

1
cytopia

たとえば、次のようなものです。

在庫:

[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.ymlbacula_client.ymlに分割できますが、次のものを含めてください。

- include: "bacula_{{ bacula_role | default('client') }}.yml"
2