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。
我有一个包含多个主机部分的剧本。我想在此 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。