Вызов Ansible group_vars, host_vars с тем же именем ключа переменной - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть структура инвентаря, как показано ниже,

[devgroup]
server001
server002

, что мы пытаемся сделать здесь, это проверить точки монтирования на этих хостах, между этими двумя серверами есть несколько общих точек монтирования. Теперь мы решили использовать group_vars и host_vars для удовлетворения требования.

group_vars/devgroup.yml
host_vars/server001.yml
        /server002.yml
devgroup.yml has below variables

mounts:
    /a
    /b
server001.yml has
mounts:
    /d
    /e
server002.yml has
mounts:
    /s
    /t

Итак, выше / a / b находятся на обоих серверах, где каждый имеет свои уникальные точки монтирования. Итак, теперь в моей книге игр, как я могу получить все переменные? в соответствии со стандартами group_vars будет перезаписывать host_vars, если он имеет одинаковое имя переменной ( mounts ). Спасибо за помощь.

1 Ответ

0 голосов
/ 16 апреля 2020

Q: "Как мне получить все переменные в моей книге игр?"

A: Цитирование из Ansible настроек конфигурации DEFAULT_HASH_BEHAVIOUR :

По умолчанию Ansible переопределяет переменные в определенных c порядках приоритета, как описано в Приоритет переменной: куда следует поместить переменную? ... Некоторые пользователи предпочитают, чтобы переменные, являющиеся хешами (иначе говоря, «словари» в терминах Python), объединялись. Этот параметр называется «слияние». Это не поведение по умолчанию, и оно не влияет на переменные, значения которых являются скалярами (целыми числами, строками) или массивами. Обычно мы рекомендуем не использовать этот параметр ...

Переменные в вопросе не являются словарями и не могут быть объединены.

Вместо этого давайте создадим словари, которые могут использоваться для монтировать файловые системы. Например

shell> cat group_vars/devgroup.yml
mounts:
    a:
      dev: sda1
      mnt: /a
    b:
      dev: sda2
      mnt: /b
shell> cat host_vars/server001.yml
mounts:
    d:
      dev: sda3
      mnt: /d
    e:
      dev: sda4
      mnt: /e
shell> cat host_vars/server002.yml
mounts:
    s:
      dev: sda5
      mnt: /s
    t:
      dev: sda6
      mnt: /t

Playbook

shell> cat pb.yml
- hosts: devgroup
  tasks:
    - debug:
        var: mounts

по умолчанию переопределяет group_vars на host_vars и дает

shell> ansible-playbook pb.yml
[...]
ok: [server001] => {
    "mounts": {
        "d": {
            "dev": "sda3", 
            "mnt": "/d"
        }, 
        "e": {
            "dev": "sda4", 
            "mnt": "/e"
        }
    }
}
ok: [server002] => {
    "mounts": {
        "s": {
            "dev": "sda5", 
            "mnt": "/s"
        }, 
        "t": {
            "dev": "sda6", 
            "mnt": "/t"
        }
    }
}

Но с ANSIBLE_HASH_BEHAVIOUR=merge та же книга воспроизведения дает объединенные словари

shell> export ANSIBLE_HASH_BEHAVIOUR=merge
shell> ansible-playbook pb.yml 
[...]
ok: [server001] => {
    "mounts": {
        "a": {
            "dev": "sda1", 
            "mnt": "/a"
        }, 
        "b": {
            "dev": "sda2", 
            "mnt": "/b"
        }, 
        "d": {
            "dev": "sda3", 
            "mnt": "/d"
        }, 
        "e": {
            "dev": "sda4", 
            "mnt": "/e"
        }
    }
}
ok: [server002] => {
    "mounts": {
        "a": {
            "dev": "sda1", 
            "mnt": "/a"
        }, 
        "b": {
            "dev": "sda2", 
            "mnt": "/b"
        }, 
        "s": {
            "dev": "sda5", 
            "mnt": "/s"
        }, 
        "t": {
            "dev": "sda6", 
            "mnt": "/t"
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...