Ansible UFW:并行循环使执行速度更快
Ansible UFW: parallel loop to make execution faster
我正在做一个添加 UFW 规则的 Ansible 任务。有时需要添加很多规则,并且它们是按顺序添加的(这当然是预期的行为)。
但我不关心规则的顺序,因为它们不重叠(它们更像是拒绝进入、拒绝退出、拒绝转发默认值的白名单)。
所以我考虑使用 async/poll features of Ansible to make the loop execution async, as in this stackexchange devops thread。
但是使用这种异步似乎对循环不起作用,或者至少对我的循环不起作用。
如果我将轮询设置为 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 }}"
结果是我的循环逐项运行,而不是更快。
关于我的配置:
- Ansible 配置为流水线并通过 ssh 多路复用连接到远程主机。
- Ansible --version
2.5.1
我可以生成一个 ufw 规则文件或 iptables,但我一开始的目标是通过 ansible API.
与 UFW 交互
考虑将任务分成更小的组。例如:
- name: configure | rules
ufw:
.
.
.
with_items: "{{ ufw_rules_set1 }}"
.
.
.
- name: configure next | rules
ufw:
.
.
.
with_items: "{{ ufw_rules_set2 }}"
.
.
.
然后异步开始工作,你会遇到大约 2 倍的加速。当然,阶段越多加速越多,但在某些时候你会达到最大值,进一步划分会让你变得更糟。
我正在做一个添加 UFW 规则的 Ansible 任务。有时需要添加很多规则,并且它们是按顺序添加的(这当然是预期的行为)。
但我不关心规则的顺序,因为它们不重叠(它们更像是拒绝进入、拒绝退出、拒绝转发默认值的白名单)。
所以我考虑使用 async/poll features of Ansible to make the loop execution async, as in this stackexchange devops thread。
但是使用这种异步似乎对循环不起作用,或者至少对我的循环不起作用。 如果我将轮询设置为 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 }}"
结果是我的循环逐项运行,而不是更快。
关于我的配置:
- Ansible 配置为流水线并通过 ssh 多路复用连接到远程主机。
- Ansible --version
2.5.1
我可以生成一个 ufw 规则文件或 iptables,但我一开始的目标是通过 ansible API.
与 UFW 交互考虑将任务分成更小的组。例如:
- name: configure | rules
ufw:
.
.
.
with_items: "{{ ufw_rules_set1 }}"
.
.
.
- name: configure next | rules
ufw:
.
.
.
with_items: "{{ ufw_rules_set2 }}"
.
.
.
然后异步开始工作,你会遇到大约 2 倍的加速。当然,阶段越多加速越多,但在某些时候你会达到最大值,进一步划分会让你变得更糟。