Ansible 合并多个匹配的 group_vars 列表

Ansible 合并多个匹配的 group_vars 列表

我们有许多服务器组,例如:

  • 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 及其相应的任务)。

相关内容