【问题标题】:How to bind configs to host groups in ansible?如何将配置绑定到ansible中的主机组?
【发布时间】:2019-11-21 00:50:08
【问题描述】:

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

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 的值如何根据每个组的配置对齐)

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

> 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。我的问题是:当我像这样构造变量组织时,如何保留组与配置的绑定。 如果我以其他任何方式进行操作也可以,但将变量从库存文件中取出。非常感谢提前

【问题讨论】:

    标签: ansible ansible-inventory


    【解决方案1】:

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

    A:group_vars中的路径错误

    group_vars/grp2/subgrp1/main.yml
    group_vars/grp2/subgrp2/main.yml
    

    在清单中,变量分别在组subgrp1subgrp2 中声明。这对应于 group_vars

    $ tree group_vars
    group_vars/
    ├── subgrp1
    │   └── main.yml
    └── subgrp2
        └── main.yml
    

    【讨论】:

    • 解决了!但是如果我的 grp1 有 subgrp1 等需要不同的值呢?那么 ansible 期望我如何构建我的文件系统组织呢?
    • How variables are mergedgroup_vars 目录结构是扁平的。
    猜你喜欢
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    相关资源
    最近更新 更多