You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Terraform与Jinja2基于关键词列表构建分组的Ansible Inventory

用Terraform+Jinja2生成无重复分组的Ansible Inventory文件

需求说明

基于虚拟机配置文件中各VM的cat子列表作为Ansible Inventory分组标签,生成对应的Inventory文件,需解决以下问题:

  • 支持任意数量的虚拟机及其标签
  • 生成无重复的分组
  • 将带对应标签的VM分配到对应分组
  • 最终输出符合Ansible Inventory格式的内容

示例虚拟机配置

abc:
  - vm_name: "abc"
    template:
      cate: Apple
      image: "ubuntu18"
    cpu_cores: 1
    memory: 1024
    cat:
      - red
      - green
      - blue
  - vm_name: "xyz"
    template:
      cate: Orange
      image: "ubuntu18"
    cpu_cores: 1
    memory: 1024
    cat:
      - red
      - blue
      - yellow
      - black

当前Terraform代码

locals {
  cfg_vars = yamldecode(file("test1.yaml"))
  list_color = flatten(local.cfg_vars["abc"][*]["cat"])
}

期望生成的Ansible Inventory格式

[red]
abc
xyz
[green]
abc
[blue]
abc
xyz
[yellow]
xyz
[black]
xyz

解决方案

1. 优化Terraform Locals整理数据

重构locals,建立标签与对应VM的映射并自动去重分组:

locals {
  # 读取配置文件
  cfg_vars = yamldecode(file("test1.yaml"))
  # 提取所有VM的列表
  vms = local.cfg_vars["abc"]
  # 生成标签到VM的映射,自动去重标签
  tag_to_vms = merge([
    for vm in local.vms : {
      for tag in vm.cat : tag => concat(lookup(local.tag_to_vms, tag, []), [vm.vm_name])
    }
  ]...)
  # 获取去重后的所有标签列表
  unique_tags = keys(local.tag_to_vms)
}

2. 编写Jinja2模板

创建inventory.tmpl模板文件:

{% for tag in unique_tags %}
[{{ tag }}]
{% for vm in tag_to_vms[tag] %}
{{ vm }}
{% endfor %}
{% endfor %}

3. 用Terraform生成Inventory文件

调用模板生成最终的Inventory文件:

resource "local_file" "ansible_inventory" {
  filename = "./inventory.ini"
  content  = templatefile("${path.module}/inventory.tmpl", {
    unique_tags = local.unique_tags
    tag_to_vms  = local.tag_to_vms
  })
}

以上实现可自动处理任意数量的VM和标签,生成无重复分组且VM分配正确的Ansible Inventory文件。

内容的提问来源于stack exchange,提问作者drmaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:12:43