Ansible 剧本范围的变量

Ansible playbook-wide variable

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

我更喜欢将全局变量保存在清单文件中,您可以在其中保存主机的组和名称。

例如:

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

如果 group_vars 不满足您的需要,set_fact 模块将完成此任务。

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/set_fact_module.html

This module allows setting new variables. Variables are set on a host-by-host >basis just like facts discovered by the setup module. These variables will >survive between plays during an Ansible run, but will not be saved across >executions even if you use a fact cache.

- 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}} 

我有一些类似的东西,几个变量依赖于一个变量,可能是用户指定的变量,在我的大部分游戏中使用(指的是东西所在的目录)。这可以使用一个包含使用 var 的播放的文件,以及另一个包含设置 var 并包含播放的单个播放的文件来完成。例如:

- name: Set global vars, import playbook that uses them
  import_playbook: do-stuff.yml
  vars:
    my_var: with_value
    some_var: "{{ my_var}}"

这里,some_var和my_var可以被do-stuff.yml中的所有play访问,用户可以根据需要覆盖my_var。