微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ansible 多个变量/值

如何解决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 }}"

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

解决方法

这里有几个问题。

  1. 您正在为 list 使用 dict 表示法([ type: A,name: mike,ip: 192.168.1.10 ] 应为 { type: A,ip: 192.168.1.10 }
  2. 您的数据结构需要两个循环,而您无法直接在剧本中进行。
  3. 您可能还想在不需要时自由删除记录,这与使用 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 举报,一经查实,本站将立刻删除。