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 }}"
如何获得将新记录添加到区域文件的结果?
这里有几处错误。
- 您正在对
dict
使用 list
表示法([ 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+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
我需要角色将记录添加到我的区域 (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 }}"
如何获得将新记录添加到区域文件的结果?
这里有几处错误。
- 您正在对
dict
使用list
表示法([ 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+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