【问题标题】:Ansible - How to loop with a dict and a module's valuesAnsible - 如何循环使用字典和模块的值
【发布时间】:2018-06-08 08:20:56
【问题描述】:

我正在尝试使用 Ansible (=> 2.5) 创建一个任务,该任务将配置如下网络接口:

- name: Set up network interfaces addr
  interfaces_file:
    dest: "/etc/network/interfaces.d/{{ item.device }}"
    iface: "{{ item.device }}"
    state: present
    option: address
    value: "{{ item.addr }}"
  with_items:
   - "{{ network }}"
  when: item.addr is defined
  notify: Restart interface

- name: Set up network interfaces netmask
  interfaces_file:
    dest: "/etc/network/interfaces.d/{{ item.device }}"
    iface: "{{ item.device }}"
    state: present
    option: netmask
    value: "{{ item.netmask }}"
  with_items:
   - "{{ network }}"
  when: item.netmask is defined
  notify: Restart interface

- name: Set up network interfaces dns
  interfaces_file:
    dest: "/etc/network/interfaces.d/{{ item.device }}"
    iface: "{{ item.device }}"
    state: present
    option: dns-nameservers
    value: "{{ item.dns }}"
  with_items:
   - "{{ network }}"
  when: item.dns is defined
  notify: Restart interface

- name: Set up network interfaces dns-search
  interfaces_file:
    dest: "/etc/network/interfaces.d/{{ item.device }}"
    iface: "{{ item.device }}"
    state: present
    option: dns-search
    value: "{{ item.dns_search }}"
  with_items:
   - "{{ network }}"
  when: item.dns_search is defined
  notify: Restart interface

这行得通。 但从我的角度来看,这不是那么干净.. 所以我正在尝试使用 2 个循环......这显然不起作用。

- name: Set up network interfaces
  interfaces_file:
    dest: "/etc/network/interfaces.d/{{ item.iDunnoWhatToPutHere }}"
    iface: "{{ item.iDunnoWhatToPutHere }}"
    state: present
    option: {{ item.option }}
    value: "{{ item.value }}"
with_together:
  - "{{ network }}"
  - { option: address, value: item.0.addr }
  - { option: netmask, value: item.0.netmask }
  - { option: dns-nameservers, value: item.0.dns }
  when: item.dns_search is defined
  notify: Restart interface
  [...]

编辑:这很好,但很严格。我应该循环 vars 应该循环每个选项及其任何选项的值。因为我也有桥接选项,例如“vlan_raw_device、bridge_ports、bridge_stp ...”。所以它应该在一个选项和值的字典上盲目循环。

Edit2:使用可变网络

network:
  - name: admin
    device: admin
    method: static
    address: X.X.X.X/X
    netmask: X.X.X.X
    up:
      net: X.X.X.X/X
      gateway: X.X.X.X/X
    down:
      net: X.X.X.X/X
      gateway: X.X.X.X/X

我为什么要尝试这一切?

  1. 因为如果必须更改,我需要更改所有值。
  2. 因为我想重启(ifup,ifdown)只有那个界面
  3. 因为我很惊讶我必须多次使用同一个模块。

你们能帮我看看如何使用它吗? 也许不可能?

谢谢大家!

【问题讨论】:

  • 在带有 3 个任务的原始剧本中,您能提供 network 变量的样子吗?
  • 当然,我编辑了问题。

标签: networking ansible


【解决方案1】:

这是一项有望满足您需求的任务。我已经用debug 模块替换了interfaces_file,只是为了打印您需要在interfaces_file 模块中实际使用的变量。为了演示,我在network 变量中添加了第二个接口:

带有变量和任务的剧本:

---
- hosts: localhost
  connection: local
  gather_facts: false
  vars:
    network:
    - name: admin
      device: admin
      method: static
      address: 10.10.10.22
      netmask: 255.255.255.0
      up:
        net: X.X.X.X/X
        gateway: X.X.X.X/X
      down:
        net: X.X.X.X/X
        gateway: X.X.X.X/X
    - name: admin22
      device: admin22
      method: static
      address: 20.20.20.22
      netmask: 255.255.255.192
      up:
        net: X.X.X.X/X
        gateway: X.X.X.X/X
      down:
        net: X.X.X.X/X
        gateway: X.X.X.X/X

  tasks:
  - name: process network config
    debug:
      msg: "dest: {{ item[0].name }}, option: {{ item[1].option }}, value: {{ item[0][item[1].value] }}"
    with_nested:
      - "{{ network }}"
      - [{ option: address, value: address }, { option: netmask, value: netmask }]

结果:

TASK [process network config] ******************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
    "msg": "dest: admin, option: address, value: 10.10.10.22"
}
ok: [localhost] => (item=None) => {
    "msg": "dest: admin, option: netmask, value: 255.255.255.0"
}
ok: [localhost] => (item=None) => {
    "msg": "dest: admin22, option: address, value: 20.20.20.22"
}
ok: [localhost] => (item=None) => {
    "msg": "dest: admin22, option: netmask, value: 255.255.255.192"
}

希望对你有帮助

【讨论】:

  • 感谢您的回复!如果没有 with_nested 的第二行,你会怎么做?这意味着您所有的选项和值都存储在变量网络中?
  • 为什么要删除第二行?如果不传递要修改多个属性的信息,我认为不可能在单个任务中实现所有这些。
  • 我的目标是将所有信息放在 host_vars 中,单个任务应该循环所有选项及其值。这些选项是不可预测的,所以对于一个主机我可以设置网桥,而对于另一个主机,我只能设置地址。我只是想做一个通用的任务。也许这是不可能的:(
  • 然后用with_nested第2行的结构制作一个列表变量,放到host_vars中,把with_nested的第2行替换为那个变量。 “框架”就在那里。
猜你喜欢
  • 2016-10-11
  • 2022-12-01
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多