Ansible конфликт групповых переменных - PullRequest
1 голос
/ 23 января 2020

Я сталкиваюсь с проблемой (функцией?), Описанной в Ansible приоритет групповых переменных , возможно, потому, что я неправильно структурировал свой инвентарь.

Идея была иметь две задачи, которые применяются ко всем «маршрутизаторам» или «межсетевым экранам», как определено в перечне. Эта часть работает нормально - Ansible правильно анализирует инвентарь и различает их.

Проблема состоит в том, что из-за способа анализа инвентаря используется тот же ansible_user и ansible_password для каждой группы клиентов. Что, очевидно, имеет смысл, основываясь на документации:

Когда группы одного и того же родительского / дочернего уровня объединяются, это делается в алфавитном порядке, а последняя загруженная группа перезаписывает предыдущие группы. Например, a_group будет объединена с переменными b_group и b_group, которые будут совпадать с переменными в a_group.

Кто-нибудь может посоветовать, как мне это исправить? Если я изменю Подгруппы «маршрутизаторы» и «брандмауэры» должны быть уникальными, например, custA_routers, custB_routers, тогда они будут вести себя как положено. Однако тогда я думаю, что должен написать задачи, ограниченные каждой из этих подгрупп. Обратите внимание, что все хосты являются уникальными IP-адресами.

Playbook:

---
- name: Check routers
  hosts: routers
  tasks:
    - name: Do stuff.
      <commands>
- name: Check firewalls
  hosts: firewalls
  tasks:
    - name: Do stuff.
      <commands>

Инвентарь:

all:
  vars:
    ansible_connection: network_cli
    ansible_network_os: ios
  children:
    customerOne:
      vars:
        ansible_user: userOne
        ansible_password: <vaulted pass>
      children:
        routers:
          hosts:
            x.x.x.x
            y.y.y.y
        firewalls:
          vars:
            ansible_network_os: asa
          hosts:
            z.z.z.z
    customerTwo:
      vars:
        ansible_user: userTwo
        ansible_password: <vaulted pass>
      children:
        routers:
          hosts:
            x.x.x.x
            y.y.y.y
        firewalls:
          vars:
            ansible_network_os: asa
          hosts:
            z.z.z.z

Ответы [ 2 ]

1 голос
/ 23 января 2020

Можно упростить инвентаризацию

all:
  vars:
    ansible_connection: network_cli
    ansible_network_os: ios
  children:
    routers:
      hosts:
        x.x.x.x
        y.y.y.y
    firewalls:
      vars:
        ansible_network_os: asa
      hosts:
        z.z.z.z

и поместить данные аутентификации в отдельную переменную. Положите его туда, где он подходит лучше всего. Это может быть раздел «all: vars:» в инвентаре, раздел «vars:» в пьесе, каталог «group_vars / all» ...

auth:
  customerOne:
    ansible_user: userOne
    ansible_password: <vaulted pass>
  customerTwo:
    ansible_user: userTwo
    ansible_password: <vaulted pass>

Добавить пьесу в начало книги. и назначьте переменные в соответствии с внешней переменной customer

- name: Read variables
  gather_facts: false
  hosts: routers
  tasks:
    - set_fact:
        ansible_user: "{{ auth[customer].ansible_user }}"
        ansible_password: "{{ auth[customer].ansible_password }}"
      run_once: true

- name: Check routers
  hosts: routers
  tasks:
    - name: Do stuff.
      <commands>

Запустите playbook и укажите клиента

ansible-playbook playbook.yml -e "customer=customerTwo"
0 голосов
/ 23 января 2020

Я думаю, что это идеально, чтобы создать два отдельных инвентаря, customerOneInventory.yaml и customerTwo.yaml или router.yaml и firewalls.yaml ... в соответствии с вашими потребностями. Вы просто укажите необходимый файл инвентаря во время запуска ansible playbook.

ansible-playbook heat-check-playbook.yaml -i customerOneInventory.yaml

...