Use ‘with_items’ com argumentos complexos para simplificar a lógica do manipulador

No Ansible, você pode precisar executar várias ações que notificam um manipulador comum. Um exemplo disso pode ser se você estiver estabelecendo vários arquivos de configuração para um aplicativo e precisar reiniciar um serviço se algum desses arquivos mudar.

Normalmente, você faria isso na seção ‘tarefas’:

 - name: template the first thing and restart on change
template: src=templates/foo.j2 dest=/etc/splat/foo.conf
notify
:
- restart fooserv

- name: template the second thing and restart on change
template: src=templates/bar.j2 dest=/etc/splat/bar.conf
notify
:
- restart fooserv

- # etc for all the things you need to template

Isso pode ser simplificado usando “with_items” e uma única instrução de notificação. Se alguma das tarefas mudar, o serviço será notificado exatamente da mesma maneira que precisa ser reiniciado no final da execução do manual.

- name:  template everything for fooserv
template: src=${item.src} dest=${item.dest}
with_items
:
- { src: 'templates/foo.j2', b: '/etc/splat/foo.conf' }
- { src: 'templates/bar.j2', b: '/etc/splat/bar.conf' }
notify
:
- restart fooserv

Observe que, como temos tarefas que usam mais de um argumento único, não dizemos apenas “$ item” na linha ‘template:’, mas usamos with_items com uma variável hash (dicionário). Você também pode mantê-lo um pouco mais curto usando listas, se desejar. Esta é uma preferência estilística:

- name:  template everything for fooserv
template: src=${item.0} dest=${item.1}
with_items
:
- [ 'templates/foo.j2', '/etc/splat/foo.conf' ]
- [ 'templates/bar.j2', '/etc/splat/bar.conf' ]
notify
:
- restart fooserv

É claro que também poderíamos definir a lista que você estava percorrendo em outro arquivo, como um arquivo “group vars / webservers” para definir todas as variáveis ​​necessárias para o grupo webservers, ou um arquivo YAML carregado da diretiva “vars files” dentro do livro de cantadas. Veja como isso pode limpar se o fizermos.

- name: template everything for fooserv
template: src=${item.src} dest=${item.dest}
with_items
: ${fooserv_template_files}
notify
:
- restart fooserv