Estou usando um manual ansible para configurar o Apache para uma lista de sites. O manual precisa copiar o modelo de configuração do host virtual para cada site e habilitar cada site usando a2ensite
:
- name: Install apache site conf
template: src=apache-sites-{{item}}-conf.j2 dest=/etc/apache2/sites-available/{{item}}.conf mode=0644
with_items:
- sitea
- siteb
- sitec
- sited
- name: Enable site apache conf
command: a2ensite {{item}}
args:
creates: /etc/apache2/sites-enabled/{{item}}.conf
with_items:
- sitea
- siteb
- sitec
- sited
Não gosto de repetir a mesma lista para cada tarefa. Como configurar o manual para executar as duas tarefas com a mesma lista de itens?
loop
umblock
bloco. Isso parece ser solicitado, mas rejeitado via Ansible GH edição 13262 .:-(
Encontrei uma solução usando globs de arquivo. Como tenho um arquivo de configuração para cada site, posso simplesmente usar a lista desses arquivos para iterar sobre todos eles. Dessa forma, não tenho a lista de sites no meu arquivo de tarefas nem uma vez, e muito menos duas. Tudo o que preciso fazer para adicionar um site é adicionar um arquivo.
Para facilitar um pouco, criei um diretório para os modelos:
roles/webserver/templates/apache-sites/sitea.conf.j2
roles/webserver/templates/apache-sites/siteb.conf.j2
roles/webserver/templates/apache-sites/sitec.conf.j2
roles/webserver/templates/apache-sites/sited.conf.j2
Então,
roles/webserver/tasks/main.yml
eu posso usar essa lista de arquivos e algumas expressões regulares:Essa técnica pode até ser usada com arquivos fictícios vazios para criar uma lista para outros aplicativos.
fonte
Konstantin deu uma boa resposta; aqui está um sabor adicional.
Geralmente definirei as listas como variáveis e apenas escrevo dois loops separados sobre a mesma variável:
Isso funciona bem com precedência variável , por exemplo, definindo diferentes conjuntos de servidores por ambiente. Também funciona quando você precisa executar várias outras tarefas sem loop entre os dois loops.
fonte