如何使用 Terraform 和 Jinja2 根据关键字列表对 Ansible 清单文件中的虚拟机进行分组

问题描述 投票:0回答:1

如何根据用户在 VM 创建配置中选择的列表项创建 Ansible 清单文件。列表项可以是任何单词(我们暂时不去验证列表项)。例如。以下是两个虚拟机的代码,

cat
子列表指定 Ansible 清单组标签。

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

到目前为止,我可以使用以下代码获取列表

locals {

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

}
  1. 一个挑战是如何跟踪 VM 的数量及其标签。虚拟机可以是任意数字,标签也可以是任意数字。
  2. 第二个挑战是如何在清单文件中创建组,但在检查所有 vms 后不应重复组。
  3. 第三是将具有该标签的虚拟机分配到这些组中。
  4. 以 jinja2 格式打印它

我也不确定如何检查和比较它们的群体,例如在上述情况下,逻辑应该给我清单文件中的组 as

[red]
%{ for group in red ~}
${ group }
%{ endfor ~}
[green]
%{ for group in green ~}
${ group }
%{ endfor ~}
.
.
.

如果用户选择以上 VM 配置的预期输出。

[red]
abc
xyz
[green]
abc
[blue]
abc
xyz
[yellow]
xyz
[black]
xyz
ansible terraform jinja2 ansible-inventory
1个回答
0
投票

一种方法是创建地图,例如

inventory_map
,如下:

locals {

  cfg_vars = yamldecode(file("test1.yaml"))
  list_color = distinct(flatten(local.cfg_vars["abc"][*]["cat"]))
  
  inventory_map = merge([for color in local.list_color: {
    for vm in local.cfg_vars["abc"]:
      color => vm.vm_name... if contains(vm.cat, color)
      } 
  ]...)
}

产生

local.inventory_map

{     
  "black" = [
    "xyz",  
  ]         
  "blue" = [
    "abc",  
    "xyz",  
  ]         
  "geen" = [  
    "abc",    
  ]        
  "red" = [   
    "abc",               
    "xyz",               
  ]           
  "yellow" = [           
    "xyz",               
  ]                      
}        

有了

local.inventory_map
,您可以创建一个templatefile来生成所需的txt文件。

© www.soinside.com 2019 - 2024. All rights reserved.