Назад | Перейти на главную страницу

Используйте имена подстановочных / динамических переменных в шаблоне Ansible jinja2

Приведенный ниже сценарий должен сгенерировать файл с содержимым:

a,b
ssh_host_key
ssh_rsa_host_key

Однако то, как я создаю имена переменных, приводит либо к синтаксическим ошибкам / ошибкам шаблонов, либо к «имени переменной не существует»:

---
- hosts: localhost
  connection: local

  vars:
    CentOS:
      ciphers: "a,b"
      hostkeys:
        - "ssh_host_key"
        - "ssh_rsa_host_key"
  tasks:
  - copy:
      dest: "{{ playbook_dir }}/test.out"
      content: |

        # This works:
        {{ CentOS.ciphers }}

        # This results in 'No variable found with this name':
        {{ lookup('vars', ansible_distribution + '.ciphers') }}

        # Templating errors:
        {% for hostkey in {{ lookup('vars', ansible_distribution + '.hostkeys') }} %}
        {{ hostkey }}
        {% endfor %}

        # Templating errors:
        {% for hostkey in {{ hostvars[inventory_hostname][ansible_distribution + '.hostkeys'] }} %}
        {{ hostkey }}
        {% endfor %}

Как правильно «собрать» имена переменных? Или есть лучший способ сделать это?

На мой вопрос ответил Мартин Крижек из группы новостей Ansible. Правильный синтаксис:

---
- hosts: localhost
  connection: local

  vars:
    CentOS:
      hostkeys:
        - "ssh_host_key"
        - "ssh_rsa_host_key"
  tasks:
  - copy:
      dest: "{{ playbook_dir }}/test.out"
      content: |
        {% for hostkey in lookup('vars', ansible_distribution)['hostkeys'] %}
        {{ hostkey }}
        {% endfor %}