Ansible: copia a configuração para os hosts atuais e outros

1

esta é uma questão teórica complicada, até mesmo a explicação em si.

Eu vou usar Bacula (software de backup de servidor) como exemplo aqui para torná-lo mais claro.

Bacula tem um servidor e um componente cliente. Adicionar um novo cliente requer um arquivo de configuração no servidor e no cliente. Então, o que eu quero fazer no meu papel é:

Função do servidor Bacula:

  1. Configure o servidor bacula em um host
  2. [para cada cliente] Copie o arquivo de configuração do cliente para o servidor no servidor
  3. [para cada cliente] Copie o arquivo de configuração do cliente para o cliente para o cliente

Agora, o problema que tenho é com host_vars e group_vars . Eu quero ser capaz de ter essa função usada por todos os meus [debian] hosts (este é um grupo). Então meu manual é assim:

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

Portanto, quando essa função é acionada, ele deve fazer o seguinte:

  1. Um host deve, obviamente, o servidor, então este terá uma provisão completa do servidor bacula se for executado no host do servidor.
  2. Se essa função for aplicada a todos os outros clientes, o seguinte deve acontecer:
    1. (host atual debian-client ): copie a configuração para debian-client
    2. (host atual debian-client ): copie a configuração para debian-server

Alguma ideia de como eu poderia fazer isso?

Para mim, é realmente difícil de explicar, então se alguma coisa sobre o acima não estiver clara, por favor me avise para que eu possa deixar mais claro.

Atualização:

Obrigado a @Konstantin Suvorov delegate_to respondeu: link

    
por cytopia 10.02.2017 / 18:19

1 resposta

2

Algo parecido com isto, por exemplo:

inventário:

[debian]
host1
host2
host3 bacula_role=server
host4
host5

jogar:

- 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

Substitua as instruções debug por algum módulo real (por exemplo, apt / template ) e inclua algum tratamento de erro, se não houver hosts com bacula_role=server .

Se você tiver muitas tarefas para instalar o servidor / cliente, poderá dividi-las em bacula_server.yml e bacula_client.yml sem when declarações, mas incluí-las com:

- include: "bacula_{{ bacula_role | default('client') }}.yml"
    
por 10.02.2017 / 20:49