Как использовать переменные в спецификации хостов в ansible playbooks и шаблонах

Я могу использовать переменные в шаблоне jinja2, но я хочу использовать переменные в шаблоне jinja2 для узлов цикла.

Пример:

У меня есть переменная env.
мой шаблон:

{% for i in groups.tag_ansible_group_{{ env }}_riak %}
  test{{ loop.index }}
{% endfor %}

Бегать:

ansible-playbook -i inventory test.yml --extra-vars = "env=prod"

Но я получаю эту ошибку

TASK [copy] **********************************************************************************************************
fatal: [testlab-lan]: FAILED! => {"changed": false, "msg": "AnsibleError: template error while templating string: expected token 'end of statement block', got '{'. String: {% for i in groups.tag_ansible_group_{{ env }}_riak %}\n  test{{ loop.index }}\n{% endfor %}"}
    to retry, use: --limit @/home/akhil/Projects/ansible-tendant/tests/test.retry

Как использовать переменную env в спецификации хостов?
Возможно ли?
Если нет, то как развернуть мой проект в разных средах, не изменяя каждый раз шаблоны?
а также если это невозможно, то какой смысл использовать переменные в хостах в playbook?

Проблема
playbook.yml

- name: configure redis slaves
  hosts: tag_ansible_group_{{ env }}_redis_slave
  vars:
    - redis_slaveof: "{% for host in groups.keys()|select('match', 'tag_ansible_group_' + env + '_redis_master')|list %} {{ hostvars[host]['ansible_default_ipv4']['address'] }} 6379 {% endfor %}"
    - redis_version: 3.2.8
  roles:
    - redis

бегать:

ansible-playbook -i dynamic_inventories/test site.yml --extra-vars "env=test"

выход:

TASK [redis : create redis config file] ******************************************************************************
fatal: [3.17.183.147]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: u\"hostvars['tag_ansible_group_test_redis_master']\" is undefined"}
fatal: [18.223.172.101]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: u\"hostvars['tag_ansible_group_test_redis_master']\" is undefined"}
Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
1
0
894
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте фильтр Выбрать ниже

{% for i in groups.keys()|select('match', 'tag_ansible_group_' + env + '_riak')|list %}

после использования вашего метода снова появляются некоторые ошибки. пожалуйста, проверьте обновленный вопрос.

Akhil 13.04.2019 12:32

В моем примере переменная «для я в группах.ключи()» «яя>» — это имя группа. Вы ошибочно использовали его как хозяин. "hostvars[<имя_группы>]", конечно, не определено.

Vladimir Botka 13.04.2019 15:06

тогда как я могу перебирать хосты в соответствующих группах... {% for i in groups.keys()|select('match', 'tag_ansible_group_' + env + '_riak')|list %} {% for j in i } {{ hostvars['j']['some_fact'] }} ... мне нужно использовать 2 цикла... это усложняет шаблоны...

Akhil 15.04.2019 08:13
Ответ принят как подходящий

это работает

{% set grp = [ 'tag_ansible_group_' , env , '_riak' ]|join() %}

{% for host in groups.get(grp) %} 
    {{ hostvars[host]['ansible_default_ipv4']['address'] }} 
{% endfor %}

Другие вопросы по теме