在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 时,剧本能够读取它。

谢谢

根据https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#organizing-host-and-group-variables

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 组,因此未使用它。此外,名为 uat1uat2 的组不存在,因为库存不是组。

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 变量应用于该特定清单中的所有主机。

或者,如果您已经在更像是组中使用这两个清单,您可以考虑将您的主机安排到一个清单中并创建一个 uat1uat2 组,例如:

[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/uat1group_vars/uat2 个文件。

这两个想法应该能让您更好地了解如何使用组和组变量。

确保您的层次结构正确: Ansible 会自动从 group_vars 加载变量(默认路径是 /etc/ansible/group_vars)。

在您的情况下,有 3 个组:allserver aserver 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