Às vezes, você deseja usar uma função Ansible para colocar manuais do ansible em um sistema de destino. Mas como você preserva a forma não interpretada das variáveis ao usar o jinja2 para modelar esse manual? Aqui está uma solução
Dentro do modelo jinja2, na primeira linha, coloque um cabeçalho que substitui o marcador de variável padrão
#jinja2: variable_start_string: "[%" , variable_end_string: "%]"
Agora, qualquer variável no formato [% variável%] será interpretada, enquanto quaisquer variáveis usando a notação ansible padrão {{variável}} serão deixadas sem interpretação.
Portanto, um modelo (hostname.j2) como este:
#jinja2: variable_start_string: "[%" , variable_end_string: "%]"
---
# usage: ansible-playbook hostname.yml -K
- hosts: 127.0.0.1
connection: local
user: admin
vars:
hostname: '[% ansible_hostname %]'
domain: '[% domain %]'
tasks:
- name: Edit /etc/hostname
copy: content='{{hostname}}' dest='/etc/hostname' force='yes'
- name: Set hostname
shell: 'hostname {{hostname}}'
- name: Set ServerName in apache2 site.conf and site-ssl.conf
lineinfile: regexp='^ServerName' line='ServerName {{hostname}}.{{domain}}' state='present' dest='{{item}}'
with_items:
- "/etc/apache2/sites-available/site.conf"
- "/etc/apache2/sites-available/site-ssl.conf"
Pode ser usado em uma tarefa Ansible dentro de outro manual ou função:
- name: Add hostname.yml playbook to target VM
template: src='hostname.j2' dest='/home/{{item.name}}/playbooks/hostname.yml'
with_items: admins
E irá renderizar como (hostname.yml), como:
---
# usage: ansible-playbook hostname.yml -K
- hosts: 127.0.0.1
connection: local
user: admin
vars:
hostname: 'testbox'
domain: 'local.lan'
tasks:
- name: Edit /etc/hostname
copy: content='{{hostname}}' dest='/etc/hostname' force='yes'
- name: Set hostname
shell: 'hostname {{hostname}}'
- name: Set ServerName in apache2 site.conf and site-ssl.conf
lineinfile: regexp='^ServerName' line='ServerName {{hostname}}.{{domain}}' state='present' dest='{{item}}'
with_items:
- "/etc/apache2/sites-available/site.conf"
- "/etc/apache2/sites-available/site-ssl.conf"
como você pode ver, na estrofe vars, hostname e domain foram interpretados, mas nada mais.
Este manual renderizado agora pode ser usado com o Ansible na VM de destino e usar os vars definidos corretamente.