Ansible中如何避免在多个play中重复运行依赖角色

90次阅读
没有评论

问题描述

在使用Ansible时,遇到一个问题:他有一组角色,所有这些角色都依赖于一个通用角色(common)。他的playbook在不同的场景下运行这些角色,但问题是,在运行特定场景的play时,common角色被重复运行,导致整个playbook的运行时间是实际所需时间的3倍。

用户想要知道如何告诉Ansible:“嗨,common已经运行过了,请跳过”。

解决方案

在解决这个问题之前,我们需要明确一些事项。Ansible并不会自动判断是否应该跳过依赖角色的运行,这取决于用户的设计和决策。根据Ansible的默认行为,同一个play中的角色只会运行一次依赖的角色。然而,如果你在不同的play中运行这些角色,那么这些依赖的角色将会被重复执行。

下面是两种解决方案,可以帮助你避免在不同play中重复运行依赖角色:

方案1: 使用import_role任务

首先,你可以使用Ansible的import_role任务来确保角色只运行一次。将所有角色放入单个play,并在每个角色的import_role任务中使用when条件来限制角色的运行。这样可以保证在不同的场景下,依赖的角色只会运行一次。

以下是示例playbook的结构:

- hosts: all
  tasks:
    - import_role:
        name: roleA
      when: inventory_hostname in groups.my_servers

    - import_role:
        name: roleB
      when: inventory_hostname in groups.special_servers

    - import_role:
        name: roleC
      when: inventory_hostname in groups.other_servers

通过使用import_rolewhen条件,你可以根据不同的主机组运行不同的角色,并确保依赖的角色只会在需要的情况下运行。

方案2: 在角色中使用控制变量

另一种方法是在角色中使用控制变量来避免重复运行依赖角色。你可以在角色中添加一个控制变量,用于记录依赖角色是否已经运行过。在运行依赖角色之前,先检查这个变量的值,如果已经运行过,就跳过依赖角色的运行。

以下是一个示例的角色任务结构,使用了一个控制变量role_common_completed

- block:
  - include_tasks: tasks.yml
  - set_fact:
      role_common_completed: true
    when: not role_common_completed | default(false)

在这个示例中,我们先引入了一个tasks.yml的任务文件,然后设置了控制变量role_common_completedtrue。这样,当角色运行时,会检查这个变量的值,如果已经设置为true,就跳过任务的执行。

通过使用控制变量,你可以在角色中控制依赖角色是否重复运行,从而避免不必要的重复操作。

注意事项

请根据你的具体情况选择适合的解决方案,并确保你的playbook结构和角色逻辑能够合理地管理依赖角色的运行。这样可以提高Ansible的执行效率,并避免不必要的重复工作。

正文完