【发布时间】: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 在需要使用角色时检查角色。
rolesplay 关键字下列出的角色是静态导入的,因此 ansible 在开始时会检查它们。如果您在任务中使用import_role,您应该会得到相同的行为。include_role将在播放特定任务时动态执行此操作。我只是不确定(昨晚无法在我的手机上测试....)ansible 是否仍在开始构建可用角色列表。您刚刚确认它会即时执行此操作。