如何在Ansible手册和模板的主机规范中使用变量

时间:2019-04-08 06:30:07

标签: ansible jinja2

我可以在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.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"}

2 个答案:

答案 0 :(得分:1)

尝试下面的 select 过滤器

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

答案 1 :(得分:0)

这有效

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

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