gpt4 book ai didi

ansible - 运行 Ansible 角色而不运行角色元中定义的依赖项

转载 作者:行者123 更新时间:2023-12-04 15:31:44 25 4
gpt4 key购买 nike

我有角色 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 使用,则需要使用剧本中的块(Ansible 2.0+):
- hosts: all

roles:
- role: nginx
tags: nginx

tasks:
- block:
- debug: msg=hello
- someaction: ...
tags: wp-vhosts

注意最后的 tags:block: 对齐所以适用于该块中的所有任务。这比将剧本分成多个剧本更干净。

无标签替代品

您可以使用 when:条件 on the role invocation在wp-vhost角色依赖中,定义一个变量如 debug_mode来控制这个。但是,与为每个角色调用或任务文件定义标签相比,这种调试/测试逻辑会使您的代码库变得困惑。

关于ansible - 运行 Ansible 角色而不运行角色元中定义的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40002801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com