terraform 多值输出
terraform multiple value output
我通过 remote-exec provisioner 从 TF 公共资源创建了多个 Digital Ocean Droplet resource (VM) using Terraform(TF) and set every VM random string password。
resource "digitalocean_droplet" "testvm" {
count = var.count_of_droplets
image = "ubuntu-20-04-x64"
name = "testvm-${count.index}"
region = "nyc3"
size = "s-1vcpu-1gb"
ssh_keys = [data.digitalocean_ssh_keys.keys.ssh_keys[0].id]
provisioner "remote-exec" {
connection {
type = "ssh"
user = "root"
private_key = file("${var.my_ssh_private_key}")
host = self.ipv4_address
}
inline = [
"echo '${var.os_user}:${random_string.password[count.index].result}' | sudo chpasswd",
"sed -i '/PermitRootLogin/c PermitRootLogin yes' /etc/ssh/sshd_config",
"systemctl restart sshd"
]
}
tags = ["dev"]
}
和随机密码生成器:
resource "random_string" "password" {
count = var.count_of_droplets
length = 16
special = true
override_special = "_%@"
}
我通过 Terraform 输出为每个创建的名称为 VM 的 VM 打印 public ip:
output "droplet_ip_addresses" {
value = {
for droplet in digitalocean_droplet.testvm :
droplet.name => droplet.ipv4_address
}
}
输出:
droplet_ip_addresses = {
- testvm-0 = "1.1.1.1"
- testvm-1 = "2.2.2.2"
}
如何将生成的密码添加到上面的输出中?喜欢:
droplets_data = {
- testvm-0 = "1.1.1.1" = "5j1dYBZzqDd30yhJ"
- testvm-1 = "2.2.2.2" = "6R%wj4zebwd9FiAt"
}
由于通过 count
创建的资源会生成一个对象列表,您可以使用两个资源列表的索引将它们映射在一起。
类似
output "droplets_data" {
value = {
for index, droplet in digitalocean_droplet.testvm :
droplet.name => "'${droplet.ipv4_address}' = '${random_string.password[index].result}'"
}
}
将输出如下所示的内容:
droplets_data = {
"testvm-0" = "'1.1.1.1' = 'KIUNOQ9YOtCk2aZQ'"
"testvm-1" = "'2.2.2.2' = 'aTPOtb4%RCcfNo@R'"
}
不过,可能更简洁的方法是创建具有 ip
和 password
属性的对象。
类似于:
output "droplets_data" {
value = {
for index, droplet in digitalocean_droplet.testvm :
droplet.name => {
ip = droplet.ipv4_address
password = random_string.password[index].result
}
}
}
这将产生:
droplets_data = {
"testvm-0" = {
"ip" = "1.1.1.1"
"password" = "KIUNOQ9YOtCk2aZQ"
}
"testvm-1" = {
"ip" = "2.2.2.2"
"password" = "aTPOtb4%RCcfNo@R"
}
}
我通过 remote-exec provisioner 从 TF 公共资源创建了多个 Digital Ocean Droplet resource (VM) using Terraform(TF) and set every VM random string password。
resource "digitalocean_droplet" "testvm" {
count = var.count_of_droplets
image = "ubuntu-20-04-x64"
name = "testvm-${count.index}"
region = "nyc3"
size = "s-1vcpu-1gb"
ssh_keys = [data.digitalocean_ssh_keys.keys.ssh_keys[0].id]
provisioner "remote-exec" {
connection {
type = "ssh"
user = "root"
private_key = file("${var.my_ssh_private_key}")
host = self.ipv4_address
}
inline = [
"echo '${var.os_user}:${random_string.password[count.index].result}' | sudo chpasswd",
"sed -i '/PermitRootLogin/c PermitRootLogin yes' /etc/ssh/sshd_config",
"systemctl restart sshd"
]
}
tags = ["dev"]
}
和随机密码生成器:
resource "random_string" "password" {
count = var.count_of_droplets
length = 16
special = true
override_special = "_%@"
}
我通过 Terraform 输出为每个创建的名称为 VM 的 VM 打印 public ip:
output "droplet_ip_addresses" {
value = {
for droplet in digitalocean_droplet.testvm :
droplet.name => droplet.ipv4_address
}
}
输出:
droplet_ip_addresses = {
- testvm-0 = "1.1.1.1"
- testvm-1 = "2.2.2.2"
}
如何将生成的密码添加到上面的输出中?喜欢:
droplets_data = {
- testvm-0 = "1.1.1.1" = "5j1dYBZzqDd30yhJ"
- testvm-1 = "2.2.2.2" = "6R%wj4zebwd9FiAt"
}
由于通过 count
创建的资源会生成一个对象列表,您可以使用两个资源列表的索引将它们映射在一起。
类似
output "droplets_data" {
value = {
for index, droplet in digitalocean_droplet.testvm :
droplet.name => "'${droplet.ipv4_address}' = '${random_string.password[index].result}'"
}
}
将输出如下所示的内容:
droplets_data = {
"testvm-0" = "'1.1.1.1' = 'KIUNOQ9YOtCk2aZQ'"
"testvm-1" = "'2.2.2.2' = 'aTPOtb4%RCcfNo@R'"
}
不过,可能更简洁的方法是创建具有 ip
和 password
属性的对象。
类似于:
output "droplets_data" {
value = {
for index, droplet in digitalocean_droplet.testvm :
droplet.name => {
ip = droplet.ipv4_address
password = random_string.password[index].result
}
}
}
这将产生:
droplets_data = {
"testvm-0" = {
"ip" = "1.1.1.1"
"password" = "KIUNOQ9YOtCk2aZQ"
}
"testvm-1" = {
"ip" = "2.2.2.2"
"password" = "aTPOtb4%RCcfNo@R"
}
}