【问题标题】:Ansible UFW: parallel loop to make execution fasterAnsible UFW:并行循环使执行更快
【发布时间】:2020-04-23 17:08:58
【问题描述】:

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

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


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

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


添加规则代码的代码sn-p:

- 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 --version 2.5.1

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

【问题讨论】:

    标签: ansible devops ufw


    【解决方案1】:

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

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

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

    【讨论】:

    • 是否有可能以编程方式进行?比如 20 个任务处理 20 个数组切片?
    • 除了在 jinja2 模板中使用循环来生成包含 20 个任务的剧本然后调用此剧本之外,我现在想不起任何其他事情了。不过这很粗略。
    猜你喜欢
    • 2019-08-08
    • 2022-11-13
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    相关资源
    最近更新 更多