Ansible - 如何改善跳过的角色性能

时间:2017-02-16 12:17:26

标签: ansible ansible-role

我有一个剧本,可以调用一些被跳过的角色。为了说明,我创建了一个具有虚拟角色的虚拟剧本。这些角色中的每一个都被跳过。

---
- hosts: localhost
  connection: local
  gather_facts: false

  roles:
     - { role: dummy, when: foo | default(false) }
     - { role: dummy, when: foo | default(false) }
     - { role: dummy, when: foo | default(false) }
     - { role: dummy, when: foo | default(false) }
     - { role: dummy, when: foo | default(false) }

和角色虚拟

---
- name: "pause 5"
  pause:
    seconds: "5"
- name: "pause 5"
  pause:
    seconds: "5"
- name: "pause 5"
  pause:
    seconds: "5"
- name: "pause 5"
  pause:
    seconds: "5"
- name: "pause 5"
  pause:
    seconds: "5"

具有角色依赖性:

---
allow_duplicates: yes
dependencies:
    - { role: dummy2, when: false }
    - { role: dummy2, when: false }
    - { role: dummy2, when: false }

另外,dummy2只是暂停:

---
- name: "pause 5"
  pause:
    seconds: "5"
---
- name: "pause 5"
  pause:
    seconds: "5"

使用此配置,有5个调用角色虚拟,它有5个任务和3个角色依赖,有2个任务。总而言之,55个任务被跳过5 *(5 * 3 * 2),在我的VM中大约需要2.5秒。如果有更多跳过的角色,则会花费更多的时间。

也许拥有许多跳过的角色不是一个好的设计,但有没有办法加速这些跳过的任务而不重写所有内容?

2 个答案:

答案 0 :(得分:2)

不幸的是,由于ansible处理跳过任务的方式,没有简单的方法可以做到这一点。您可以尝试的一些选项:

  • stdout_callback = skippy添加到您的ansible配置中(自2.0起可用)。这将使日志记录不记录跳过的任务,这使得输出更好,并且可能使运行更快。请注意,这是一个全局设置,因此如果您确实要记录某些跳过的任务,这不是最好的选择。
  • 将您的角色转移到单独的剧本中,并在这些单独的剧本中再次使用主要的ansible剧本简单地调用ansible-playbook命令。在这种情况下,跳过的调用将完全跳过所有内容,但您需要单独处理这些调用中的错误,并找出将命令行参数传播到这些单独调用中的方法

答案 1 :(得分:1)

如果您使用的是Ansible 2.0或更高版本,则可以使用在foo为true时失败的- block:,以及在块失败时运行任务的rescue:

---
- hosts: localhost
  connection: local
  gather_facts: false
  tasks:

    - block:
        - name: "Fail when foo is true"
          fail:
          when:
            - foo is defined
            - foo
      rescue:
        - name: "Run dummy  role if fail task failed"
          include_role:
            name: dummy

    - block:
        - name: "Fail when foo is true"
          fail:
          when:
            - foo is defined
            - foo
      rescue:
        - name: "Run dummy role if fail task failed"
          include_role:
            name: dummy

当角色被触发时,你最终会遇到一些可怕的“失败”,但它应该消除许多“跳过”的任务。