Ansible-如何提高跳过角色的性能

Ansible-如何提高跳过角色的性能,ansible,ansible-role,Ansible,Ansible Role,我有一个剧本,它调用了一些被跳过的角色。为了举例说明,我创建了一个带有虚拟角色的虚拟剧本。跳过所有这些角色 --- - hosts: localhost connection: local gather_facts: false roles: - { role: dummy, when: foo | default(false) } - { role: dummy, when: foo | default(false) } - { role: dumm

我有一个剧本,它调用了一些被跳过的角色。为了举例说明,我创建了一个带有虚拟角色的虚拟剧本。跳过所有这些角色

---
- 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个对role dummy的调用,其中有5个任务和3个角色依赖项,其中有2个任务。因此,总共跳过55个任务5*(5*3*2),这在我的虚拟机中大约需要2,5秒。如果跳过的角色越多,则所需的时间就越多


有许多跳过的角色可能不是一个很好的设计,但是有没有办法在不重新编写所有内容的情况下加速这些跳过的任务?

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

  • stdout\u callback=skippy
    添加到您的ansible配置中(从2.0开始提供)。这将使日志记录不会记录跳过的任务,从而使输出更好,并可能使运行更快。请注意,这是一个全局设置,因此,如果您确实希望记录一些跳过的任务,那么这不是最好的使用方法
  • 将您的角色移动到单独的剧本中,并在这些单独的剧本上再次调用
    ansible playbook
    命令,即可获得一个主ansible playbook。在这种情况下,跳过的调用将完全跳过所有内容,但您需要单独处理这些调用中的错误,并找出将命令行参数传播到这些单独调用中的方法

如果您使用的是Ansible 2.0或更高版本,则可以使用当foo为true时将失败的
-block:
,以及当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

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

您的解决方案非常有效,谢谢!!我将它与
full\u skip
stdout回调模块结合使用。不再有可怕的“失败”!实际上唯一的缺点是
include\u role
的选项'allow\u duplicate'不起作用。