Ansible: Как пропустить пустой элемент при использовании модуля with_items? - PullRequest
1 голос
/ 23 февраля 2020

Я хотел использовать модуль iptables с with_items для зацикливания этих правил

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -s 127.0.0.0/8 -j DROP

Как вы можете видеть, они имеют разные типы источников (адрес источника, интерфейс ввода, интерфейс вывода), которые могут вызвать проблема при использовании with_item.

Вот мой Ansible код

- name: Drop packet from loopback IP
  iptables:
    chain: "{{ item.chain }}"
    source: "{{ item.source }}"
    in_interface: "{{ item.in_interface }}"
    out_interface: "{{ item.out_interface }}"
    jump: " {{ item.jump }}"
  with_items:
    - { chain: INPUT, in_interface: lo, jump:  ACCEPT }
    - { chain: OUTPUT, out_interface: lo, jump:  ACCEPT }
    - { chain: INPUT, source: 127.0.0.0/8, jump:  DROP }

В каждом элементе есть пропущенные поля.

Например, первый - это source и out_interface, потому что он явно имеет только in_interface. Итак, мой вопрос, как я могу обработать эти пустые поля?

Спасибо за тонну

1 Ответ

2 голосов
/ 23 февраля 2020

Q: «Как мне обработать эти пустые поля?»

A: Использовать фильтр по умолчанию (не указан) . Например

- name: Drop packet from loopback IP
  iptables:
    chain: "{{ item.chain }}"
    source: "{{ item.source|default(omit) }}"
    in_interface: "{{ item.in_interface|default(omit) }}"
    out_interface: "{{ item.out_interface|default(omit) }}"
    jump: " {{ item.jump }}"
  with_items:
    - { chain: INPUT, in_interface: lo, jump:  ACCEPT }
    - { chain: OUTPUT, out_interface: lo, jump:  ACCEPT }
    - { chain: INPUT, source: 127.0.0.0/8, jump:  DROP }
...