我这样做的方法是使用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 之类的变量来控制它。但是,与为每个角色调用或任务文件定义标签相比,这样的调试/测试逻辑会使您的代码库变得混乱。