我有一个剧本,可以调用一些被跳过的角色。为了说明,我创建了一个具有虚拟角色的虚拟剧本。这些角色中的每一个都被跳过。
---
- 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秒。如果有更多跳过的角色,则会花费更多的时间。
也许拥有许多跳过的角色不是一个好的设计,但有没有办法加速这些跳过的任务而不重写所有内容?
答案 0 :(得分:2)
不幸的是,由于ansible处理跳过任务的方式,没有简单的方法可以做到这一点。您可以尝试的一些选项:
stdout_callback = skippy
添加到您的ansible配置中(自2.0起可用)。这将使日志记录不记录跳过的任务,这使得输出更好,并且可能使运行更快。请注意,这是一个全局设置,因此如果您确实要记录某些跳过的任务,这不是最好的选择。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
当角色被触发时,你最终会遇到一些可怕的“失败”,但它应该消除许多“跳过”的任务。