运行 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-vhostnginx角色也会运行。我知道这很好,这是一种理想的行为。

但是,在我的本地开发过程中,运行宁 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 逻辑会使您的代码库变得混乱。