【问题标题】:How to ignore missing role error on Ansible如何忽略 Ansible 上的角色缺失错误
【发布时间】:2022-02-09 16:15:32
【问题描述】:

我们有一个 ansible 项目,它使用了许多不包含在同一个 git 存储库中的角色(我将其称为外部角色)。我们使用带有 requirements.yml 文件的 ansible-galaxy 来安装这些角色,但我们必须经常手动运行它才能获得最新版本的角色。

我想摆脱这个手动任务,所以我创建了一个 playbook,它将通过 site.yml 中的 import_playbook 在其他人之前调用。它的唯一目的是运行 ansible-galaxy 命令以确保已安装外部角色并且在可用的最新版本中。

项目结构:

- project
  - roles
    - project_role1
    - project_role2
    - requirements.yml
  - playbook
    - 1_install_roles.yml
    - 2_mainplaybook.yml
  - site.yml

- external_roleA
  - tasks ...

site.yml

  - import_playbook: ./playbooks/install_roles.yml
  - import_playbook: ./playbooks/playbook1.yml

1_install_roles.yml

---
- hosts: localhost
    
  tasks:
    - name: Auto-Update ansible role
      command: ansible-galaxy install -r roles/requirements.yml -p roles --force
      delegate_to: localhost
      register: galaxy-output
      changed_when: '"was installed successfully" in galaxy-output.stdout'

    - name: Show ansible-galaxy output
      debug: msg="{{ galaxy-output.stdout }}"

2_mainplaybook.yml

---
  - name: mainplaybook
    hosts: all
    
    roles:
    - role: project_role1
    - role: external_roleA
    - role: project_role2

它适用于更新角色,但当角色尚未安装在本地机器上时失败,我收到以下错误:

ERROR! the role 'external_roleA' was not found

因为此时ansible是对的,所以找不到角色而是会在到达这个特定步骤之前安装。所以我的问题是如何忽略这个错误?或者我如何告诉 ansible 在使用角色之前不要检查角色。

【问题讨论】:

  • 在任务中使用 include_role,它只会在运行时进行评估,但我什至不确定它是否会起作用。
  • @zeitounator 有同样的想法和同样的担忧。查理必须试试这个……
  • @Zeitounator 是的,它可以在剧本中的任务中使用 incliude_role。看起来 Ansible 只检查角色关键字下列出的角色。
  • @CharlyRoch ansible 在需要使用角色时检查角色。 roles play 关键字下列出的角色是静态导入的,因此 ansible 在开始时会检查它们。如果您在任务中使用import_role,您应该会得到相同的行为。 include_role 将在播放特定任务时动态执行此操作。我只是不确定(昨晚无法在我的手机上测试....)ansible 是否仍在开始构建可用角色列表。您刚刚确认它会即时执行此操作。

标签: ansible ansible-galaxy


【解决方案1】:

正如@Zeitounator 提到的,一个解决方案是在剧本内的任务中使用include_role

---
  - name: mainplaybook
    hosts: all
    
    tasks:
      - include_role: 
        name: external_roleA

在剧本中混合任务和角色时,请注意 Ansible 具有特定的执行顺序:

当您在播放级别使用角色选项时,Ansible 会处理 角色作为静态导入并在剧本解析期间处理它们。 Ansible 按以下顺序执行您的剧本:

  • 剧本中定义的任何 pre_tasks。
  • pre_tasks 触发的任何处理程序。
  • roles: 中列出的每个角色,按列出的顺序。在角色的 meta/main.yml 中定义的任何角色依赖项首先运行,受标签过滤和条件限制。有关更多详细信息,请参阅使用角色依赖项。
  • 剧中定义的任何任务。
  • 角色或任务触发的任何处理程序。
  • 剧本中定义的任何 post_tasks。
  • 任何由 post_tasks 触发的处理程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-28
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多