如何用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
相关产品推荐
相关产品推荐

