Q: «Почему мы не цитируем [host] и [GROUP_NAME] в шаблоне jinja2?»
A: Оба host и GROUP_NAME - переменные. Значение переменных необходимо в индексе. Если имена переменных заключены в кавычки 'host' или 'GROUP_NAME' , имена переменных используются вместо значений переменных.
Прямое и косвенное
Например, шаблон
shell> cat test.txt.j2
{{ dict[index] }}
{{ dict['index'] }}
и playbook
shell> cat playbook.yml
- hosts: localhost
vars:
dict:
index: value of attribute index
attr1: value of attribute attr1
tasks:
- template:
src: test.txt.j2
dest: test.txt
vars:
index: attr1
дают
shell> cat test.txt
value of attribute attr1
value of attribute index
Это не ограничивается шаблонами. В целом это действительно так. Например,
- debug:
msg:
- "{{ dict[index] }}"
- "{{ dict['index'] }}"
vars:
index: attr1
дает
msg:
- value of attribute attr1
- value of attribute index
Пунктирный
Можно использовать «пунктирную» ссылку. Например,
- debug:
var: dict.index
дает
dict.index: value of attribute index
«Пунктирная» ссылка может использоваться во вложенных словарях. Например, с вложенным словарем
dict:
index:
var1: value of attribute index
attr1:
var1: value of attribute attr1
обе версии работают должным образом
- debug:
msg:
- "{{ dict.index.var1 }}"
- "{{ dict['index'].var1 }}"
vars:
index: attr1
дает
msg:
- value of attribute index
- value of attribute index
Пунктирные ссылки в шаблоне
Но есть разница, когда используется шаблон. Когда ссылка помещается в квадратные скобки []
, все последующие ссылки также должны быть помещены в квадратные скобки. В противном случае шаблон выйдет из строя. Например,
shell> cat test.txt.j2
{{ dict.index.var1 }} # OK
{{ dict.index['var1'] }} # OK
{{ dict['index']['var1'] }} # OK
{{ dict['index'].var1 }} # WRONG: has no attribute var1
не удастся
fatal: [localhost]: FAILED! => changed=false
msg: 'AnsibleUndefinedVariable:
''ansible.parsing.yaml.objects.AnsibleUnicode object''
has no attribute ''var1'''