0

我正在制作一个添加 UFW 规则的 Ansible 任务。有时要添加很多规则,并且它们是按顺序添加的(当然这是预期的行为)。

但我不关心规则的顺序,因为它们不重叠(它们更像是从拒绝输入、拒绝输出、拒绝转发默认值中列入白名单)。


所以我考虑使用 Ansible 的async/poll 特性来使循环执行异步,就像在这个stackexchange devops thread中一样。

但是似乎使用这种异步不适用于循环,或者至少对我的循环不起作用。如果我将 poll 设置为 0,规则会像以前一样按顺序添加,而不是更快。如果我将 poll 设置为正数,它的运行速度会比以前慢。


添加规则的代码片段:

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

结果是我的循环逐项运行,而不是更快。

关于我的配置:

  1. Ansible 配置为流水线,并通过 ssh 多路复用连接到远程主机。
  2. Ansible --版本2.5.1

我可以生成一个 ufw 规则文件或 iptables,但我一开始的目标是通过 ansible API 与 UFW 交互。

4

1 回答 1

1

考虑将任务分成更小的组。例如:

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

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

然后异步将开始工作,您会遇到大约 2 倍的加速。当然,阶段越多,加速越多,但在某些时候你会达到最大值,进一步划分会让你的情况变得更糟。

于 2020-04-23T20:04:44.493 回答