Как получить доступ к переменным за пределами элемента при использовании with_items? - PullRequest
0 голосов
/ 10 июня 2019

У меня есть роль, которая использует with_items:

- name: Create backup config files
  template:
    src: "config.yml.j2"
    dest: "/tmp/{{ project }}_{{ env }}_{{ item.type }}.yml"
  with_items:
    - "{{ backups }}"

Я могу получить доступ к item.type, как обычно, но не к project или env, которые определены вне коллекции:

deploy / main.yml

- hosts: ...
  vars:
    project: ...
    rails_env: qa

  roles:
    - role: ../../../roles/deploy/dolly
      project: "{{ project }}"
      env: "{{ rails_env }}"
      backups:
        - type: mysql
          username: ... 
          password: ...

Я получаю ошибку:

Error was a <class 'ansible.errors.AnsibleError'>, original message: An unhandled exception occurred while templating '{{ project }}'

Шаблон config.j2.yml:

type: {{  item.type }}
project: {{ project }}
env: {{ env }}
database:
  username: {{ item.username }}
  password: {{ item.password }}

1 Ответ

0 голосов
/ 24 июня 2019

Оказывается, нельзя переопределить переменную с тем же именем, что и существующая переменная, поэтому project: {{ project }} всегда будет с ошибкой.

Вместо project можно опустить и использовать существующее определение в vars.

- hosts: ...
  vars:
    project: ... # <- already defined here

  roles:
    - role: ../../../roles/deploy/dolly
      backups:
        - type: mysql
          username: ... 
          password: ...

Если переменная не определена в vars, ее можно определить в роли:

- hosts: ...
  vars:
    name: ...

  roles:   
    - role: ../../../roles/deploy/dolly
      project: "{{ name }}" # <- define here
      backups:
        - type: mysql
          username: ... 
          password: ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...