Ansible playbook-wide变量

时间:2015-11-30 05:47:07

标签: variables ansible

我有一个包含多个主机部分的剧本。我想在这个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中(不是我想要的,但是有效)。我也知道可以包含变量文件,但这会影响可读性。是否有任何建议将其置于正确的范围内(例如,剧本文件本身)?

2 个答案:

答案 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中以获得相同的结果。