![Ansible 合并多个匹配的 group_vars 列表](https://linux22.com/image/739950/Ansible%20%E5%90%88%E5%B9%B6%E5%A4%9A%E4%B8%AA%E5%8C%B9%E9%85%8D%E7%9A%84%20group_vars%20%E5%88%97%E8%A1%A8.png)
我们有许多服务器组,例如:
- MTL(服务器位于蒙特利尔)
- OTA(服务器位于渥太华)
- DMZ(暴露于互联网的反向代理)
- APP(应用服务器)
- CUSTOMER_X(包含客户 X 的服务器)
- CUSTOMER_Y(包含客户 Y 的服务器)
每个服务器组都有自己的 cron 作业,并且一个服务器可以属于多个匹配和不匹配的组(一个服务器可以属于所有组 MTL、DMZ、APP、CUSTOMER_Y 和 CUSTOMER_X)。
我们想要做的是合并给定服务器的所有匹配的 group_vars 的“cron_jobs”列表。
这可能吗?否则,有没有办法实现等效效果?
我们当然可以这样做:
crons: "{{ all_crons + dmz_crons + mtl_crons }}" # etc ..
但考虑到我们有数百个团体,那将是非常乡巴佬
非常感谢您的帮助
答案1
为每个功能创建一个角色 (OTA、MTL、DMZ、APP、CUSTOMER_X、CUSTOMER_Y)
- hosts: dmz
roles:
- { role: dmz}
- hosts: ota
become: yes
roles:
- { role: ota}
- hosts: app
become: yes
roles:
- { role: app}
每个角色都针对功能做了特定的配置(即 dmz 配置了一个 dmz),并且还添加了所需的 cron 作业。
您可以通过使用作为元文件夹依赖项添加的通用角色来优化角色,避免重复代码。
例如,在角色app
文件夹中meta
创建一个文件 main.yml,其内容如下:
dependencies:
- { role: common,
common_cron_job: "{{app_common_cron_job}}"
}
可以在每个 ansible 组中设置的值app_common_cron_job
,例如 group_vars\app
公共角色将使用 中提供的值执行创建 cron 作业所需的任务common_cron_job
。如果每个组都需要多个作业,请修改代码以传递作业结构。
看我的教程使用 Vagrant 和 Ansible 创建 Kubernetes 集群有关如何使用元文件夹和依赖项的完整示例。请参阅我的教程使用 Ansible 进行 Terraform 管理的 AWS 基础设施有关如何使用组变量的示例。
存在于多个组中的主机最终将为其每个组执行一个角色,并且 common_cron_job 的值将更改为 groupvars 为该组定义的值。最后将创建所有需要的 cron 作业。
请注意,您还需要一种方法来清除不再需要的已创建的 cron 作业(提示:使用 common_cron_job_delete var 及其相应的任务)。