我有一个包含多个主机部分的剧本。我想在这个playbook.yml文件中定义一个仅适用于该文件的变量,例如:
vars:
my_global_var: 'hello'
- hosts: db
tasks:
-shell: echo {{my_global_var}}
- hosts: web
tasks:
-shell: echo {{my_global_var}}
上面的例子不起作用。我必须为每个主机部分复制变量(坏)或在更高级别定义它,例如在我的group_vars/all
中(不是我想要的,但是有效)。我也知道可以包含变量文件,但这会影响可读性。是否有任何建议将其置于正确的范围内(例如,剧本文件本身)?
答案 0 :(得分:10)
如果group_vars不适合您的需要,set_fact
模块将完成此操作。
http://docs.ansible.com/ansible/set_fact_module.html
此模块允许设置新变量。变量基于主机>基础设置,就像设置模块发现的事实一样。在Ansible运行期间,这些变量将在播放之间存活,但即使您使用事实缓存,也不会在>执行中保存。
- hosts: db:web
tasks:
- set_fact: my_global_var='hello'
- hosts: db
tasks:
-shell: echo {{my_global_var}}
- hosts: web
tasks:
-shell: echo {{my_global_var}}
答案 1 :(得分:4)
我更喜欢将全局变量保留在清单文件中,您可以在其中保留主机的组和名称。
例如:
my-hosts
:
[all:vars]
my_global_var="hello"
[db]
db1
db2
[web]
web1
web2
运行您的剧本:
ansible-playbook -i my-hosts playbook.yml
现在将为所有主机定义变量。
如果您使用ec2.py
或其他dynamic inventory,则可以将全局变量放在文件group_vars/all
中以获得相同的结果。