Ansible - как зацикливаться с dict и значениями модуля - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь создать задачу с 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. Потому что я удивлен, что у меня естьиспользовать несколько раз один и тот же модуль.

Можете ли вы, ребята, помочь мне узнать, как это использовать?Может быть, это невозможно?

Спасибо, ребята!

1 Ответ

0 голосов
/ 11 июня 2018

вот задача, которая, надеюсь, удовлетворит ваши потребности.я заменил interfaces_file на debug модуль, просто чтобы напечатать переменные, которые вам нужно использовать в модуле interfaces_file.Для демонстрации я добавил второй интерфейс в переменную network:

playbook с переменной и задачей:

---
- 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"
}

надеюсь, это поможет

...