Как указано в комментарии @ ydaetskcoR , ваш инвентарь неверен, потому что вам нужно, чтобы список хостов был непосредственным дочерним элементом атрибута hosts
.
Обратите внимание, что список, который вы получите, создается с помощью скобок []
, генерирующих кортежи, около for
в вашем шаблоне Terraform, в отличие от использования скобок {}
для создания объектов.
Тип скобок вокруг выражения for
определяет, какой тип результата оно дает. В приведенном выше примере используются [
и ]
, что создает кортеж. Если вместо этого используются {
и }
, результатом является объект, и необходимо предоставить два результирующих выражения, разделенных символом =>
.
https://www.terraform.io/docs/configuration/expressions.html#for -выражения
Если ваша структура должна выглядеть как all > server1, server2, server3
Тогда ваш инвентарь должен быть
all:
hosts:
server1:
ansible_host: 10.0.0.2
ansible_port: 5986
server2:
ansible_host: 10.0.0.3
ansible_port: 5986
server3:
ansible_host: 10.0.0.4
ansible_port: 5986
Это подход для шаблона Terraform, создающего это:
${yamlencode({
"all": {
"hosts": {
for i, ip in vm-ip:
"server${i+1}" => {
"ansible_host": "${ip}",
"ansible_port": 5986
}
}
}
})}
Что дает этот действительный inventory.yaml :
"all":
"hosts":
"server1":
"ansible_host": "10.0.0.2"
"ansible_port": 5986
"server2":
"ansible_host": "10.0.0.3"
"ansible_port": 5986
"server3":
"ansible_host": "10.0.0.4"
"ansible_port": 5986
С другой стороны, если вам нужна структура типа all > server > server1, server2, server3
, тогда вы должны сделать server
дочерним элементом all
и использовать запись children
в ваш инвентарь:
all:
children:
server:
hosts:
server1:
ansible_host: 10.0.0.2
ansible_port: 5986
server2:
ansible_host: 10.0.0.3
ansible_port: 5986
server3:
ansible_host: 10.0.0.4
ansible_port: 5986
Для этого соответствующий шаблон Terraform будет
${yamlencode({
"all": {
"children": {
"server": {
"hosts": {
for i, ip in vm-ip:
"server${i+1}" => {
"ansible_host": "${ip}",
"ansible_port": 5986
}
}
}
}
}
})}
, который производит это inventory.yaml :
"all":
"children":
"server":
"hosts":
"server1":
"ansible_host": "10.0.0.2"
"ansible_port": 5986
"server2":
"ansible_host": "10.0.0.3"
"ansible_port": 5986
"server3":
"ansible_host": "10.0.0.4"
"ansible_port": 5986
Примечание: для всех приведенных выше примеров я использую файл terraform test.tf ниже:
resource "local_file" "AnsibleInventory" {
content = templatefile("inventory.tpl", {
vm-ip = ["10.0.0.2","10.0.0.3","10.0.0.4"],
})
filename = "inventory.yaml"
}