我需要添加记录到我的区域的角色(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 }}"
如何获得一个结果,其中添加了一个新的记录到区域文件?
这里有几个地方不对。
- 您使用
list
符号表示dict
([ type: A, name: mike, ip: 192.168.1.10 ]
应该是{ type: A, name: mike, ip: 192.168.1.10 }
) - 你的数据结构需要两个循环,你不能直接在剧本中做。
- 你可能也想有自由地删除记录,当他们不需要的时候,不像使用
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+INs+"{{ 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