Ansible UFW: параллель l oop для ускорения выполнения - PullRequest
0 голосов
/ 23 апреля 2020

Я делаю задачу Ansible, которая добавляет правила UFW. Иногда нужно добавить много правил, и они добавляются последовательно (что, конечно, является ожидаемым поведением).

Но меня не волнует порядок правил, поскольку они не перекрываются (они это больше похоже на внесение в белый список от значений запрета на вход, запрета, запрета форвард по умолчанию.


Поэтому я подумал об использовании функций асинхронного / опроса из Ansible, чтобы сделать l oop выполнение asyn c, как в этом stackexchange devops thread .

Но, похоже, использование asyn c не работает для циклов или, по крайней мере, для моего l oop. Если я установлю опрос на 0, правила добавляются последовательно, как и раньше, и не быстрее. Если я установлю опрос на положительное число, он будет работать даже медленнее, чем раньше.


Фрагмент кода с кодом добавления правила:

- name: configure | rules
  ufw:
    rule: "{{ item.rule }}"
    interface: "{{ item.interface | default('') }}"
    direction: "{{ item.direction | default('in') }}"
    from_ip: "{{ item.from_ip | default('any') }}"
    to_ip: "{{ item.to_ip | default('any') }}"
    from_port: "{{ item.from_port | default('') }}"
    to_port: "{{ item.to_port | default('') }}"
    protocol: "{{ item.protocol | default('any') }}"
    route: "{{ item.route | default(omit) }}"
    log: "{{ item.log | default(false) }}"
    comment: "{{ item.comment | default(omit) }}"
  with_items: "{{ ufw_rules }}"
  register: _create_instances
  async: 1000
  poll: 0
  notify: reload ufw
  tags:
    - ufw-configure-rules


- name: Wait for creation to finish
  async_status:
    jid: "{{ item.ansible_job_id }}"
  register: _jobs
  until: _jobs.finished
  delay: 5  # Check every 5 seconds. Adjust as you like.                                                                                                                                                    
  retries: 10  # Retry up to 10 times. Adjust as needed.                                                                                                                                                    
  with_items: "{{ _create_instances.results }}"

В результате получается мой l oop запускает элемент за элементом, не быстрее.

О моей конфигурации:

  1. Ansible настроен для конвейерной передачи и подключается к удаленным хостам через мультиплексирование s sh.
  2. Ansible --version 2.5.1

Я мог бы сгенерировать файлы правил ufw или iptables, но вначале моя цель - взаимодействовать с UFW через ansible API .

1 Ответ

1 голос
/ 23 апреля 2020

Рассмотрим разделение задач на более мелкие группы. Например:

- name: configure | rules
  ufw:
  .
  .
  .
with_items: "{{ ufw_rules_set1 }}"
.
.
.

- name: configure next | rules
  ufw:
  .
  .
  .
with_items: "{{ ufw_rules_set2 }}"
.
.
.

Тогда asyn c будет работать, и вы столкнетесь примерно с 2-кратным ускорением. Конечно, чем больше этапов, тем больше ускорение, но в какой-то момент вы достигнете максимума, и дальнейшее деление ухудшит ваше положение.

...