Возможны множественные переменные / значение

Мне нужна роль, которая добавляет записи в мои зоны (bind9)

В hostvars я создал вары, как показано ниже:

zones:
    zone.name1:
      - [ type: A, name: mike, ip: 192.168.1.10 ]
      - [ type: A, name: bob, ip: 192.168.1.11 ]

    zone.name2:
      - [ type: A, name: alice, ip: 192.168.1.12 ]
      - [ type: A, name: joanne, ip: 192.168.1.13 ]

В роли / задачах / main.yaml

- lineinfile:
    path: "/etc/bind/zones/{{ item }}.zone"
    line: '@   IN   "{{ item.value.type }}"   "{{ item.value.name }}" "{{ item.value.i }}"'
  with_items: "{{ zones | dict2items }}"

Как получить результат, добавляющий новую запись в файл зоны?


person ksmar    schedule 19.02.2021    source источник
comment
Что он делает в настоящее время, что вы хотите, чтобы он делал, и какую ошибку вызывает ваша текущая попытка?   -  person mdaniel    schedule 19.02.2021


Ответы (1)


Здесь есть несколько ошибок.

  1. Вы используете обозначение list для dict ([ type: A, name: mike, ip: 192.168.1.10 ] должно быть { type: A, name: mike, ip: 192.168.1.10 })
  2. Ваша структура данных требует двух циклов, которые вы не можете сделать непосредственно в playbook.
  3. Вероятно, вы также захотите иметь возможность удалять записи, когда они не нужны, что не работает точно так же при использовании lineinfile.

Следующее решение устраняет все вышеперечисленные проблемы:

# main.yaml

---

- hosts: all
  gather_facts: no
  connection: local
  vars:
    zones:
      zone.name1:
        - { type: A, name: mike, ip: 192.168.1.10 }
        # Remove this record
        - { type: A, name: bob,  ip: 192.168.1.11, state: absent }
      zone.name2:
        - { type: A, name: alice,  ip: 192.168.1.12 }
        - { type: A, name: joanne, ip: 192.168.1.13 }
  tasks:
    - include_tasks: lines.yaml
      loop: "{{ zones | dict2items }}"
      loop_control:
        loop_var: records

Еще один файл задачи, который мы просматриваем в цикле:

# lines.yaml

---

- lineinfile:
    path: /tmp/{{ records.key }}.zone
    line: >-
      @   IN   "{{ item.type }}"   "{{ item.name }}" "{{ item.ip }}"
    regexp: >-
      ^@\s+IN\s+"{{ item.type }}"\s+"{{ item.name }}"\s+"{{ item.ip }}"$
    state: >-
      {{ 'present' if 'state' not in item or item.state == 'present' else 'absent' }}
  loop: "{{ records.value }}"

Выполните это с помощью этой команды:

ansible-playbook -i localhost, --diff main.yaml
person jtyr    schedule 23.02.2021