4

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

---
- 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 次调用角色 dummy,它有 5 个任务和 3 个角色依赖项和 2 个任务。因此,总共跳过了 55 个任务 5*(5*3*2),这在我的 VM 中大约需要 2.5 秒。如果有更多跳过的角色,则线性地花费更多时间。

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

4

2 回答 2

2

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

  • 添加stdout_callback = skippy到您的 ansible 配置(自 2.0 起可用)。这将使日志记录不记录跳过的任务,从而使输出更好,并且也可能使运行更快。请注意,这是一个全局设置,因此如果您确实想记录一些跳过的任务,这不是最好的选择。
  • 将您的角色移动到单独的剧本中,并拥有一个主要的 ansible 剧本,只需ansible-playbook在这些单独的剧本上再次调用命令即可。在这种情况下,跳过的调用将完全跳过所有内容,但您需要分别处理这些调用中的错误,并找出一种将命令行参数传播到这些单独调用中的方法
于 2017-02-16T12:51:01.337 回答
1

如果您使用的是 Ansible 2.0 或更高版本,您可以使用 a- block:当 foo 为真时将失败,而 arescue:在块失败时将运行您的任务。

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

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

于 2017-08-02T20:30:38.693 回答