Как привязать конфиги к группам хостов в ansible? - PullRequest
1 голос
/ 21 ноября 2019

Ниже приведена «рабочая» версия, в которой я определяю конфигурацию в своем файле инвентаризации: Файл инвентаризации:

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 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. Мой вопрос: как я могу сохранить привязку группы к конфигу, когда я структурирую свою организацию переменных следующим образом. Также было бы хорошо, если бы я сделал это любым другим способом, но вытащил переменные из файла инвентаризации. Большое спасибо заранее

1 Ответ

1 голос
/ 21 ноября 2019

Q: " Как мне сохранить привязку группы с помощью конфигурации?"

A: Пути в 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
...