gpt4 book ai didi

azure - 带有 terraform 的 cloud-init 无法循环用户

转载 作者:行者123 更新时间:2023-12-03 05:14:37 26 4
gpt4 key购买 nike

所以我有以下 Terraform 代码:​​`

我有以下模板文件:

#cloud-config
users:
%{ for user in user_list ~}
- name: ${user.username}
gecos: ${user.username}
ssh-authorized-keys:
- ${user.ssh_public_key}
lock_passwd: true
groups: sudo
shell: /bin/bash
%{ endfor }
packages:
jp

以下 Terraform 代码:​​

...
output "users" {
value = [for k in local.external_users : k.username]
}

data "template_cloudinit_config" "config" {
gzip = true
base64_encode = true
part {
filename = "cloud-init.cfg"
content_type = "text/cloud-config"
content = templatefile("${path.module}/templates/userdataloop.yaml", {
user_list = local.external_users
})
}

resource "azurerm_virtual_machine" "jphostvm" {
...
os_profile {
computer_name = "${var.environment}-jp-${format("%02d", count.index + 1)}"
admin_username = "deploy"
custom_data = data.template_cloudinit_config.config.rendered
}

最后是以下用户(在不同的 tf 文件中声明):`

locals {
external_users = [
{
username = "ian"
ssh_public_key = data.vault_generic_secret.ian.data["key"]
},
{
username = "fred"
ssh_public_key = data.vault_generic_secret.fred.data["key"]
},
{
username = "ken"
ssh_public_key = data.vault_generic_secret.ken.data["key"]
}
]
}

我根本无法创建多个用户。请注意,输出循环显示所有用户名。按如下方式传递单个用户效果非常好:

data "template_cloudinit_config" "config" {
gzip = true
base64_encode = true
part {
filename = "cloud-init.cfg"
content_type = "text/cloud-config"
content = templatefile("${path.module}/templates/userdataloop.yaml", {
username = "fred"
ssh_public_key = data.vault_generic_secret.fred.data["key"]
})
}

并使用以下模板:

#cloud-config
users:
- default
- name: ${username}
gecos: ${username}
ssh-authorized-keys:
- ${ssh_public_key}
lock_passwd: true
groups: sudo
shell: /bin/bash
}

谁能帮忙解决这个问题吗?我只是不知道出了什么问题,并且代码默默地失败了,所以没有错误消息指向我。这是代码用于虚拟机的 debian 镜像。谢谢。

最佳答案

使用 cloud-init 配置系统时,处理过程中的任何错误都将写入虚拟机文件系统内的 cloud-init 日志中。您在哪里可以找到这些日志取决于您的 AMI 的配置方式,但默认位置是 /var/log/cloud-init.log

<小时/>

您在问题中显示了两个不同的模板,其中一个包含 for 指令,而另一个仅包含插值。

这两个都没有遵循 Generating JSON or YAML from a template 中的建议,因此您尝试通过字符串连接生成 YAML 可能会生成无效的 YAML 语法或不具有您想要的含义的内容。

以下模板使用 yamlencode 来代替,以保证结果始终是有效的 YAML 语法:

#cloud-config
${yamlencode({
users = [
for user in user_list : {
name = user.username
gecos = user.username
ssh_authorized_keys = [user.ssh_public_key]
lock_passwd = true
groups = "sudo"
shell = "/bin/bash"
}
]
packages = [
"jp",
]
})}

我还将您的 ssh-authorized-keys key 更改为 ssh_authorized_keys,因为这似乎是 the relevant cloud-config example 中使用的名称。 .

如果您使用上面这样的模板来保证结果是有效的 YAML 语法,但它仍然不起作用,那么这表明 YAML 表示的数据存在问题,而不是 YAML 的语法有问题。在这种情况下,您需要引用虚拟机中的 cloud-init 日志,以了解当它尝试解释您的 cloud-config 数据结构时发生了什么。

关于azure - 带有 terraform 的 cloud-init 无法循环用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75283738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com