如何解决Ansible 多个变量/值
我需要扮演将记录添加到我的区域的角色 (bind9)
在主机变量中,我创建了如下变量:
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,ip: 192.168.1.10 }
) - 您的数据结构需要两个循环,而您无法直接在剧本中进行。
- 您可能还想在不需要时自由删除记录,这与使用
lineinfile
时不同。
以下解决方案解决了上述所有问题:
# main.yaml
---
- hosts: all
gather_facts: no
connection: local
vars:
zones:
zone.name1:
- { type: A,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。