Ansible UFW:并行循环以加快执行速度
我正在做一个添加UFW规则的任务。有时需要添加很多规则,它们是按顺序添加的(当然这是预期的行为) 但我不关心规则的顺序,因为它们不重叠(它们更像是拒绝输入、拒绝输出、拒绝转发默认值的白名单)Ansible UFW:并行循环以加快执行速度,ansible,devops,ufw,Ansible,Devops,Ufw,我正在做一个添加UFW规则的任务。有时需要添加很多规则,它们是按顺序添加的(当然这是预期的行为) 但我不关心规则的顺序,因为它们不重叠(它们更像是拒绝输入、拒绝输出、拒绝转发默认值的白名单) 因此,我考虑使用Ansible函数使循环执行异步,如下所示 但使用这种异步似乎不适用于循环,或者至少不适用于我的循环。 如果我将poll设置为0,则规则会像以前一样按顺序添加,不会更快。 如果我将poll设置为正数,它的运行速度甚至比以前慢 添加代码的规则的代码段: - name: configure
因此,我考虑使用Ansible函数使循环执行异步,如下所示 但使用这种异步似乎不适用于循环,或者至少不适用于我的循环。 如果我将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 }}"
结果是我的循环逐项运行,而不是更快
关于我的配置:
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 }}"
.
.
.
然后async将开始工作,您将遇到大约2倍的加速。当然,阶段越多,加速速度就越快,但在某一点上,你达到了最大值,进一步划分会使你的情况变得更糟。是否可以通过编程来实现这一点?比如20个任务处理20个数组切片?我现在想不起来除了使用jinja2模板中的循环生成包含20个任务的剧本,然后调用这个剧本之外还有什么别的。不过,这还很粗略。