我正在制作一个添加 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 }}"
结果是我的循环逐项运行,而不是更快。
关于我的配置:
- Ansible 配置为流水线,并通过 ssh 多路复用连接到远程主机。
- Ansible --版本
2.5.1
我可以生成一个 ufw 规则文件或 iptables,但我一开始的目标是通过 ansible API 与 UFW 交互。