Ansible:将配置复制到当前主机和其他主机

Ansible:将配置复制到当前主机和其他主机

这是一个棘手的理论问题,甚至解释本身也很难。

Bacula这里以(服务器备份软件)为例,以便更加清楚。

Bacula 有一个服务器和一个客户端组件。添加新客户端需要在服务器和客户端上都有一个配置文件。所以我想在我的角色中做的是:

Bacula 服务器角色:

  1. 在一台主机上设置bacula服务器
  2. [针对每个客户端] 将服务器的客户端配置文件复制到服务器
  3. [针对每个客户端] 将客户端配置文件复制到客户端

现在我遇到的问题是host_varsgroup_vars。我希望能够让所有[debian]主机(这是一个组)使用此角色。因此,我的剧本如下所示:

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

因此,当触发此角色时,它应该执行以下操作:

  1. 一个主机显然必须是服务器,因此如果它在服务器主机上播放,它将获得完整的 bacula 服务器配置。
  2. 如果将此角色应用于所有其他客户端,则应该发生以下情况:
    1. (当前主机debian-client):将配置复制到debian-client
    2. (当前主机debian-client):将配置复制到debian-server

你知道该如何做吗?


对我来说,这真的很难解释,所以如果上述内容有任何不清楚的地方,请告诉我,以便我可以更清楚地解释。

更新:

感谢@Konstantin Suvorov 的delegate_to回答:https://docs.ansible.com/ansible/playbooks_delegation.html#delegation

答案1

例如这样的:

存货:

[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存在主机则添加一些错误处理。

如果您有许多任务要安装服务器/客户端,您可以将它们拆分bacula_server.ymlbacula_client.yml不带when语句的任务,但包括以下内容:

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

相关内容