Crie um modelo de manual do Ansible sem interpretar variáveis

À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.

fontes:
https://groups.google.com/forum/#!searchin/ansible-project/jinja$20template$20ignore$20variable$20/ansible-project/Bn1ZFu5Pfb0/nydE8pkB0ZYJ