Ansible 倍数 vars/value

Ansible multiple vars/value

我需要角色将记录添加到我的区域 (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 ]

在role/tasks/main.yaml

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

如何获得将新记录添加到区域文件的结果?

这里有几处错误。

  1. 您正在对 dict 使用 list 表示法([ type: A, name: mike, ip: 192.168.1.10 ] 应该是 { type: A, name: mike, ip: 192.168.1.10 }
  2. 您的数据结构需要两个循环,您不能直接在剧本中这样做。
  3. 您可能还希望在不需要时可以自由删除记录,这在使用 lineinfile.
  4. 时是行不通的

以下解决方案解决了上述所有问题:

# 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