运行 Ansible 角色没有 运行 角色元中定义的依赖关系
Run Ansible role without running dependencies defined in the role's meta
我有一个角色 wp-vhost
,它依赖于一个角色:
// roles/wp-vhost/meta/main.yml
---
dependencies:
- { role: nginx }
每次我运行wp-vhost
,nginx
角色也会运行。我知道这很好,这是一种理想的行为。
但是,在我的本地开发过程中,运行宁 nginx
角色不必要地浪费了时间,当我只想 运行 定义在 wp-vhosts
中的任务时因为我知道 nginx
之前有 运行 并为 wp-vhost
.
设置了必要的环境
有没有办法在不执行角色依赖的情况下执行带有角色的剧本?
我这样做的方法是使用 Ansible tags 并将它们应用于您的 "wp-vhost" 特定代码。
假设您的 wp-vhost
角色的主要剧本在 main.yml
中,一个好的模式是将实际任务分解成一个名为 wp-vhost.yml
的子剧本,包含在 main.yml,所以非 nginx 代码得到一个没有应用到 nginx 角色的标签。在这种情况下:
- include: wp-vhost.yml
tags: wp-vhost
为了为每个 Ansible 代码块(无论是包含的任务文件还是角色)使用标签,请尝试像这样编写 dependencies
中提到的每个角色:
- role: nginx
tags: nginx
在测试模式下,您可以 运行 像这样的 wp-vhost 特定部分:
$ ansible-playbook --tags wp-vhost main.yml
或者您可以 运行 整个剧本,包括像这样的任何依赖项 - 默认是 运行 一切都忽略标签:
$ ansible-playbook main.yml
这使得快速 运行 只是一组复杂的级联角色的一部分变得容易,并且在测试时包含文件,并且还可以在其他角色的依赖项中正常使用 wp-vhost 角色。
对角色结构的影响
谨慎使用标签不会影响角色结构或使用,您通常只会将标签用于测试。
对于更复杂的角色,在任何情况下将任务构建到单独的文件中是很常见的,保持 main.yml 简单,如下所示:
- name: Set up base OS
include: base_os.yml
tags: base_os
- name: Ensure logs are rotated
include: logrotate.yml
tags: logrotate
- name: Create users and groups
include: users_groups.yml
tags: users_groups
没有包含文件的解决方案
如果您不想更改 wp-vhosts 对包含文件的使用,您需要在 playbook (Ansible 2.0+) 中使用块:
- hosts: all
roles:
- role: nginx
tags: nginx
tasks:
- block:
- debug: msg=hello
- someaction: ...
tags: wp-vhosts
请注意,最后的 tags:
与 block:
对齐,因此适用于该块中的所有任务。这比将剧本分成多个剧本更清晰。
非标签选择
您可以在 wp-vhost 角色依赖项中使用 when:
条件 on the role invocation,并定义一个变量,例如 debug_mode
来控制它。但是,与为每个角色调用或任务文件定义一个标签相比,这样的 debug/test 逻辑会使您的代码库变得混乱。
我有一个角色 wp-vhost
,它依赖于一个角色:
// roles/wp-vhost/meta/main.yml
---
dependencies:
- { role: nginx }
每次我运行wp-vhost
,nginx
角色也会运行。我知道这很好,这是一种理想的行为。
但是,在我的本地开发过程中,运行宁 nginx
角色不必要地浪费了时间,当我只想 运行 定义在 wp-vhosts
中的任务时因为我知道 nginx
之前有 运行 并为 wp-vhost
.
有没有办法在不执行角色依赖的情况下执行带有角色的剧本?
我这样做的方法是使用 Ansible tags 并将它们应用于您的 "wp-vhost" 特定代码。
假设您的 wp-vhost
角色的主要剧本在 main.yml
中,一个好的模式是将实际任务分解成一个名为 wp-vhost.yml
的子剧本,包含在 main.yml,所以非 nginx 代码得到一个没有应用到 nginx 角色的标签。在这种情况下:
- include: wp-vhost.yml
tags: wp-vhost
为了为每个 Ansible 代码块(无论是包含的任务文件还是角色)使用标签,请尝试像这样编写 dependencies
中提到的每个角色:
- role: nginx
tags: nginx
在测试模式下,您可以 运行 像这样的 wp-vhost 特定部分:
$ ansible-playbook --tags wp-vhost main.yml
或者您可以 运行 整个剧本,包括像这样的任何依赖项 - 默认是 运行 一切都忽略标签:
$ ansible-playbook main.yml
这使得快速 运行 只是一组复杂的级联角色的一部分变得容易,并且在测试时包含文件,并且还可以在其他角色的依赖项中正常使用 wp-vhost 角色。
对角色结构的影响
谨慎使用标签不会影响角色结构或使用,您通常只会将标签用于测试。
对于更复杂的角色,在任何情况下将任务构建到单独的文件中是很常见的,保持 main.yml 简单,如下所示:
- name: Set up base OS
include: base_os.yml
tags: base_os
- name: Ensure logs are rotated
include: logrotate.yml
tags: logrotate
- name: Create users and groups
include: users_groups.yml
tags: users_groups
没有包含文件的解决方案
如果您不想更改 wp-vhosts 对包含文件的使用,您需要在 playbook (Ansible 2.0+) 中使用块:
- hosts: all
roles:
- role: nginx
tags: nginx
tasks:
- block:
- debug: msg=hello
- someaction: ...
tags: wp-vhosts
请注意,最后的 tags:
与 block:
对齐,因此适用于该块中的所有任务。这比将剧本分成多个剧本更清晰。
非标签选择
您可以在 wp-vhost 角色依赖项中使用 when:
条件 on the role invocation,并定义一个变量,例如 debug_mode
来控制它。但是,与为每个角色调用或任务文件定义一个标签相比,这样的 debug/test 逻辑会使您的代码库变得混乱。