Ansible UFW:并行循环以加快执行速度

Ansible UFW:并行循环以加快执行速度,ansible,devops,ufw,Ansible,Devops,Ufw,我正在做一个添加UFW规则的任务。有时需要添加很多规则,它们是按顺序添加的(当然这是预期的行为) 但我不关心规则的顺序,因为它们不重叠(它们更像是拒绝输入、拒绝输出、拒绝转发默认值的白名单) 因此,我考虑使用Ansible函数使循环执行异步,如下所示 但使用这种异步似乎不适用于循环,或者至少不适用于我的循环。 如果我将poll设置为0,则规则会像以前一样按顺序添加,不会更快。 如果我将poll设置为正数,它的运行速度甚至比以前慢 添加代码的规则的代码段: - name: configure

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

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


因此,我考虑使用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 }}"
结果是我的循环逐项运行,而不是更快

关于我的配置:

  • Ansible配置为流水线,并通过ssh多路复用连接到远程主机
  • Ansible--版本
    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个任务的剧本,然后调用这个剧本之外还有什么别的。不过,这还很粗略。