在ansible中从group_vars读取变量值
Read variable value from group_vars in ansible
我正在尝试从组变量中读取变量值。但是 ansible 无法找到该值。
我的库存文件夹是这样的:
prod.ini
uat1.ini
uat2.ini
我的 uat1.ini 看起来像:
[server a]
12.12.12.12
[server b]
13.13.131.1
我的 uat2.ini 看起来像:
[server a]
1.1.1.2
[server b]
2.23.12.5
group vars 文件夹如下所示:
all
environment
在环境文件夹中我有子文件夹
uat1 and uat2
在 uat1 和 uat2 中我有一个名为 pick.yml
的文件
对于 uat1 我有以下 pick.yml
modern: "re run"
对于 uat2 我有以下 pick.yml
modern: "no re run"
我的剧本看起来像:
- name: try and run to get the value of group vars
hosts: server a
debug:
var: modern
i 运行 我的剧本使用以下命令:
ansible-playbook -i inventory/uat2.ini -b playbookname
我的期望是 - 它应该 return 来自 uat2 的值 "no re run"。但不能 return 那。
但是当我将该组变量放入 group_vars/all 时,剧本能够读取它。
谢谢
Ansible loads host and group variable files by searching paths relative to the inventory file or the playbook file. If your inventory file at /etc/ansible/hosts contains a host named ‘foosball’ that belongs to two groups, ‘raleigh’ and ‘webservers’, that host will use variables in YAML files at the following locations:
/etc/ansible/group_vars/raleigh # can optionally end in '.yml', '.yaml', or '.json'
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball
You can also create directories named after your groups or hosts. Ansible will read all the files in these directories in lexicographical order. An example with the ‘raleigh’ group:
/etc/ansible/group_vars/raleigh/db_settings
/etc/ansible/group_vars/raleigh/cluster_settings
在您的例子中,environment
文件夹是组名。由于您没有 environment
组,因此未使用它。此外,名为 uat1
和 uat2
的组不存在,因为库存不是组。
all
组变量有效,因为它是一个特殊的默认组:
There are two default groups: all and ungrouped. The all group contains every host.
听起来您想为每个库存设置一组变量。在这种情况下,您可以为 all
组设置清单中的变量:
[all:vars]
modern="re run"
[server a]
12.12.12.12
[server b]
13.13.131.1
这会将 modern
变量应用于该特定清单中的所有主机。
或者,如果您已经在更像是组中使用这两个清单,您可以考虑将您的主机安排到一个清单中并创建一个 uat1
和 uat2
组,例如:
[server a]
12.12.12.12
1.1.1.2
[server b]
13.13.131.1
2.23.12.5
[uat1]
12.12.12.12
13.13.131.1
[uat2]
1.1.1.2
2.23.12.5
在这种情况下,您可以拥有 group_vars/uat1
和 group_vars/uat2
个文件。
这两个想法应该能让您更好地了解如何使用组和组变量。
确保您的层次结构正确:
Ansible 会自动从 group_vars 加载变量(默认路径是 /etc/ansible/group_vars)。
在您的情况下,有 3 个组:all
、server a
和 server b
。
假设组 server a
中有一台名为 "server_a" 的主机,将为该主机加载以下 group_vars(默认情况下,仅当这些文件存在时):
/etc/ansible/group_vars/all.yml
/etc/ansible/group_vars/<group name>.yml
{{ playbook_dir }}/group_vars/all.yml
{{ playbook_dir }}/group_vars/<group name>.yml
因此,除非您创建正确的层次结构,或者在您的配置文件或剧本中调整 group_vars 的路径,否则您将无法导入 group_vars。
您的用例的示例层次结构:
/etc/ansible/group_vars:
all.yml
server a.yml
server b.yml
我正在尝试从组变量中读取变量值。但是 ansible 无法找到该值。
我的库存文件夹是这样的:
prod.ini
uat1.ini
uat2.ini
我的 uat1.ini 看起来像:
[server a]
12.12.12.12
[server b]
13.13.131.1
我的 uat2.ini 看起来像:
[server a]
1.1.1.2
[server b]
2.23.12.5
group vars 文件夹如下所示:
all
environment
在环境文件夹中我有子文件夹
uat1 and uat2
在 uat1 和 uat2 中我有一个名为 pick.yml
的文件对于 uat1 我有以下 pick.yml
modern: "re run"
对于 uat2 我有以下 pick.yml
modern: "no re run"
我的剧本看起来像:
- name: try and run to get the value of group vars
hosts: server a
debug:
var: modern
i 运行 我的剧本使用以下命令:
ansible-playbook -i inventory/uat2.ini -b playbookname
我的期望是 - 它应该 return 来自 uat2 的值 "no re run"。但不能 return 那。 但是当我将该组变量放入 group_vars/all 时,剧本能够读取它。
谢谢
Ansible loads host and group variable files by searching paths relative to the inventory file or the playbook file. If your inventory file at /etc/ansible/hosts contains a host named ‘foosball’ that belongs to two groups, ‘raleigh’ and ‘webservers’, that host will use variables in YAML files at the following locations:
/etc/ansible/group_vars/raleigh # can optionally end in '.yml', '.yaml', or '.json'
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball
You can also create directories named after your groups or hosts. Ansible will read all the files in these directories in lexicographical order. An example with the ‘raleigh’ group:
/etc/ansible/group_vars/raleigh/db_settings
/etc/ansible/group_vars/raleigh/cluster_settings
在您的例子中,environment
文件夹是组名。由于您没有 environment
组,因此未使用它。此外,名为 uat1
和 uat2
的组不存在,因为库存不是组。
all
组变量有效,因为它是一个特殊的默认组:
There are two default groups: all and ungrouped. The all group contains every host.
听起来您想为每个库存设置一组变量。在这种情况下,您可以为 all
组设置清单中的变量:
[all:vars]
modern="re run"
[server a]
12.12.12.12
[server b]
13.13.131.1
这会将 modern
变量应用于该特定清单中的所有主机。
或者,如果您已经在更像是组中使用这两个清单,您可以考虑将您的主机安排到一个清单中并创建一个 uat1
和 uat2
组,例如:
[server a]
12.12.12.12
1.1.1.2
[server b]
13.13.131.1
2.23.12.5
[uat1]
12.12.12.12
13.13.131.1
[uat2]
1.1.1.2
2.23.12.5
在这种情况下,您可以拥有 group_vars/uat1
和 group_vars/uat2
个文件。
这两个想法应该能让您更好地了解如何使用组和组变量。
确保您的层次结构正确: Ansible 会自动从 group_vars 加载变量(默认路径是 /etc/ansible/group_vars)。
在您的情况下,有 3 个组:all
、server a
和 server b
。
假设组 server a
中有一台名为 "server_a" 的主机,将为该主机加载以下 group_vars(默认情况下,仅当这些文件存在时):
/etc/ansible/group_vars/all.yml
/etc/ansible/group_vars/<group name>.yml
{{ playbook_dir }}/group_vars/all.yml
{{ playbook_dir }}/group_vars/<group name>.yml
因此,除非您创建正确的层次结构,或者在您的配置文件或剧本中调整 group_vars 的路径,否则您将无法导入 group_vars。
您的用例的示例层次结构:
/etc/ansible/group_vars:
all.yml
server a.yml
server b.yml