Funções de repetição ansíveis

6

Eu uso o Ansible para gerenciar alguns servidores web e de banco de dados que executam sites para vários vhosts. Para cada site, preciso atribuir uma função de banco de dados ao grupo dbservers e uma função de site ao grupo de servidores da web. Então, meu manual é parecido com isto:

- hosts: dbservers
  roles: 
      - { role: database, vhost: 'host1.com', db: 'customdb' }
      - { role: database, vhost: 'other.com' }

- hosts: webservers
  roles: 
      - { role: website, vhost: 'host1.com', db: 'customdb' }
      - { role: website, vhost: 'other.com' }

Isso funciona bem, mas é feio porque tenho que repetir tudo duas vezes. Isso é especialmente propenso a erros ao alterar alguns parâmetros dos valores padrão (como db no vhost host1.com neste exemplo).

Existe uma maneira de escrever isso para que eu possa ter uma única lista de vhosts com todos os parâmetros necessários e adicionar automaticamente as diferentes funções aos diferentes grupos de host para cada entrada vhost?

    
por Sven 06.04.2015 / 16:53

3 respostas

7

a resposta mais óbvia - use variáveis complexas (dicionários) para manter seus valores e, em seguida, passe a variável inteira:

- layouts:
  - layout1:
      vhost: host1.com
      db: customdb
  - layout2:
      vhost: other.com

use-os para passar para funções:

- hosts: dbservers
  roles:
  - { role: database, layout: layouts.layout1 }
  - { role: database, layout: layouts.layout2 }

- hosts: webservers
  roles:
  - { role: webserver, layout: layouts.layout1 }
  - { role: webserver, layout: layouts.layout2 }

Eu fiz isso com sucesso no passado. Para preencher os layouts, você pode usar várias técnicas: combinando "group_vars / all" com "vars_files" com "host_vars" etc.

    
por 06.04.2015 / 22:13
5

O que eu faço é criar funções apache , que instala o apache e faz alguma configuração para todos os vhosts, apache-vhost , que instala um vhost, host1-com e other-com . Então o manual seria assim:

- hosts: host1-com-servers
  roles:
    - apache
    - host1-com

- hosts: other-com-servers
  roles:
    - apache
    - other-com

Agora, host1-com terá isso:

- meta:
  - dependencies:
    - role: apache-vhost
      server_name: host1.com
      server_aliases:
        - www.host1.com
      extras: |
        Alias /static /var/local/myapp/static
        <Location /static>
          Require all granted
        </Location>
        # Whatever else you want
      whatever_other_variables_apache-vhost_needs: XXX

(Esse é um detalhe de implementação, mas a função apache-vhost prepara algumas configurações essenciais do vhost com base nas variáveis passadas para ele e também adiciona a variável extras como está dentro da configuração do vhost.)

Da mesma forma, para os bancos de dados, você pode ter uma função postgresql , uma função postgresql-database e assim por diante.

    
por 07.04.2015 / 11:15
4

Em vez de agrupar seus hosts por função, você poderia agrupá-los por função e fazer com que Ansible execute uma determinada função em um host somente se esse host for encontrado no grupo designado para essa função.

[role_db_customdb]
other.com

[role_db_otherdb]
host1.com

[role_website]
host1.com
other.com

Você pode até transmitir parâmetros para uma função, conforme ilustrado com o parâmetro db no código abaixo.

---
- hosts: all

  roles:
    - { role: database, db: 'customdb', when: inventory_hostname in groups.role_db_customdb }
    - { role: database, db: 'otherdb', when: inventory_hostname in groups.role_db_otherdb }
    - { role: website, when: inventory_hostname in groups.role_webservers }
    
por 06.04.2015 / 21:18

Tags