在ansible中从group_vars中读取变量值。

问题描述 投票:1回答:2

我正试图从组变量中读取变量值,但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

我用下面的命令运行我的剧本

 ansible-playbook -i inventory/uat2.ini  -b playbookname

我的期望是--它应该返回Uat2的值,也就是 "no re run",但不能返回。但是当我把组变量放在group_varsall中时,playbook能够读取它。

谢谢,谢谢

ansible ansible-2.x
2个回答
1
投票

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

在你的例子中,有3个组。all, server 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

因此,除非你创建了正确的层次结构,或者调整了配置文件或playbook中group_vars的路径,否则你将无法导入group_vars。

例如你的用例中的层次结构。

/etc/ansible/group_vars:
    all.yml
    server a.yml
    server b.yml

1
投票

根据... https:/docs.ansible.comansiblelatestuser_guideintro_inventory.html#organizing-host-and-group-variables。:

Ansible通过搜索相对于清单文件或playbook文件的路径来加载主机和组变量文件。如果你在etcansiblehosts的清单文件中包含一个名为'foosball'的主机,它属于两个组,'raleigh'和'webservers',该主机将在以下位置使用YAML文件中的变量。

/etc/ansible/group_vars/raleigh # can optionally end in '.yml', '.yaml', or '.json'
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball

你也可以创建以组或主机命名的目录。Ansible将按照词法顺序读取这些目录中的所有文件。以'raleigh'组为例。

/etc/ansible/group_vars/raleigh/db_settings
/etc/ansible/group_vars/raleigh/cluster_settings

在你的例子中 environment 文件夹是组名。由于您没有 environment 组,它不被使用。此外,名为 uat1uat2 不存在,因为清单不是群体。

all 组变量的作用,因为它是一个特殊的默认组。

有两个默认组: all和ungrouped。all组包含每个主机。

听起来你想为每个库存设置一组变量。在这种情况下,你可以做的是在目录中为以下变量设置变量 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 文件。

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

© www.soinside.com 2019 - 2024. All rights reserved.