如何将配置绑定到ansible中的主机组?

如何将配置绑定到ansible中的主机组?,ansible,ansible-inventory,Ansible,Ansible Inventory,下面是一个“工作”版本,我在清单文件中定义了配置: 库存文件: all: children: grp1: hosts: host1: grp2: children: subgrp1: vars: config_vars: name1: "value1" name2: "value2" hosts:

下面是一个“工作”版本,我在清单文件中定义了配置: 库存文件:

all:
  children:
    grp1:
      hosts:
        host1:
    grp2:
      children:
        subgrp1:
          vars:
            config_vars:
              name1: "value1"
              name2: "value2"
          hosts:
            host11:
            host12:
        subgrp2:
          vars:
            config_vars:
              name1: "value3"
              name2: "value4"
          hosts:
            host21:
            host22:
    grp3:
      hosts:
        host31:
        host32:
我的剧本看起来像:

---
- name: test play
  hosts: grp2
  connection: ssh
  gather_facts: no
  remote_user: ec2-user
  tasks:
    - debug:
        msg: "inventory_hostname = {{ inventory_hostname}} and item.key = {{ item.key }} and value = {{ item.value }} "
      when: "{{ item['key'] }} == config_vars "
      loop: "{{ lookup('dict', hostvars[inventory_hostname]) }}"
运行
ansible playbook-i hosts.yml p1.yml
时,我有:

ok: [host22] => (item={'key': 'config_vars', 'value': {'name1': 'value3', 'name2': 'value4'}}) => {
...
ok: [host21] => (item={'key': 'config_vars', 'value': {'name1': 'value3', 'name2': 'value4'}}) => {
...
ok: [host11] => (item={'key': 'config_vars', 'value': {'name1': 'value1', 'name2': 'value2'}}) => {
...
ok: [host12] => (item={'key': 'config_vars', 'value': {'name1': 'value1', 'name2': 'value2'}}) => {
(请参见name1和name2的值如何根据每个组的配置对齐)

我所拥有的“非工作”配置是,我从清单文件中删除配置变量,取而代之的是一个与hosts.yml结构匹配的目录结构,并且配置变量dict粘贴在每个组的目录下

> cat group_vars/grp2/subgrp2/main.yml
config_vars:
  name1: "value3"
  name2: "value4"

> cat group_vars/grp2/subgrp1/main.yml
config_vars:
  name1: "value1"
  name2: "value2"
然后,我像前面一样重新运行该命令,我看到:

ok: [host22] => (item={'key': 'config_vars', 'value': {'name1': 'value3', 'name2': 'value4'}}) => {
ok: [host12] => (item={'key': 'config_vars', 'value': {'name1': 'value3', 'name2': 'value4'}}) => {
ok: [host21] => (item={'key': 'config_vars', 'value': {'name1': 'value3', 'name2': 'value4'}}) => {
ok: [host11] => (item={'key': 'config_vars', 'value': {'name1': 'value3', 'name2': 'value4'}}) => {
(值1和值2被删除)

我知道为什么会这样;这是因为后面读取的是值3和值4,因此它们将替换值1和值2。我的问题是:当我这样构造我的变量组织时,如何保持组与配置的绑定。 如果我用其他方法也可以,但是要从库存文件中取出变量。非常感谢

问:“我如何保持组与配置的绑定?”

A:组变量中的路径错误

group_vars/grp2/subgrp1/main.yml
group_vars/grp2/subgrp2/main.yml
在清单中,变量分别在subgrp1和subgrp2组中声明。这对应于组变量


这就解决了!但是如果我的grp1有需要不同值的subgrp1 etc呢?ansible希望我如何构建我的文件系统组织?请参阅。组变量的目录结构是扁平的。
$ tree group_vars
group_vars/
├── subgrp1
│   └── main.yml
└── subgrp2
    └── main.yml