ansible - 如何在ansible剧本和模板中使用主机规范中的变量
问题描述
我可以在 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"}
解决方案
试试下面的选择过滤器
{% for i in groups.keys()|select('match', 'tag_ansible_group_' + env + '_riak')|list %}
推荐阅读
- json - 在反应中传递道具 - 获取
- python-3.x - 如何将 python 脚本日志记录到在 Google Cloud VM 上运行的 Google Stackdriver 日志记录中
- javascript - getElementsByTagName 的替代方法并传递信息
- actionscript-3 - 如何在具有控制功能的动作脚本中创建拖放类,同时仍然是通用的?
- c++ - 新手:如何为 w7 安装(哪个)C++ 编译器?
- json - jstree hover_node 为 ToolTip 使用自定义数据
- python - 为分类算法绘制散点图
- javascript - IJavaScriptExecutor.ExecuteScript 等到 ajax 完成
- php - 解码 UTF8 的问题
- javascript - 如何在 React Js 中单独更新一个子组件