如何将配置绑定到 ansible 中的主机组?
How to bind configs to host groups in ansible?
下面是一个 "working" 版本,我在清单文件中定义了配置:
库存文件:
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 的值如何根据每个组的配置对齐)
我的 "non-working" 配置是,我从清单文件中删除了 config_vars,取而代之的目录结构与 hosts.yml 结构相匹配,而 config_vars 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'}}) => {
(value1 和 value2 被破坏)
我知道为什么会这样;这是因为后面读取了value3和value4,所以它们替换了value 1和value2。我的问题是:当我像这样构建我的变量组织时,如何保留组与配置的绑定。
如果我以任何其他方式执行它也很好,但是将变量从清单文件中取出。非常感谢
Q: "How can I preserve the binding of the group with the config?"
答:group_vars中的路径错误
group_vars/grp2/subgrp1/main.yml
group_vars/grp2/subgrp2/main.yml
在清单中,变量分别声明在组subgrp1和subgrp2中。这对应于group_vars
$ tree group_vars
group_vars/
├── subgrp1
│ └── main.yml
└── subgrp2
└── main.yml
下面是一个 "working" 版本,我在清单文件中定义了配置: 库存文件:
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 的值如何根据每个组的配置对齐)
我的 "non-working" 配置是,我从清单文件中删除了 config_vars,取而代之的目录结构与 hosts.yml 结构相匹配,而 config_vars 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'}}) => {
(value1 和 value2 被破坏)
我知道为什么会这样;这是因为后面读取了value3和value4,所以它们替换了value 1和value2。我的问题是:当我像这样构建我的变量组织时,如何保留组与配置的绑定。 如果我以任何其他方式执行它也很好,但是将变量从清单文件中取出。非常感谢
Q: "How can I preserve the binding of the group with the config?"
答:group_vars中的路径错误
group_vars/grp2/subgrp1/main.yml
group_vars/grp2/subgrp2/main.yml
在清单中,变量分别声明在组subgrp1和subgrp2中。这对应于group_vars
$ tree group_vars
group_vars/
├── subgrp1
│ └── main.yml
└── subgrp2
└── main.yml