所以我有以下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映像,代码用于虚拟机。谢谢。
1条答案
按热度按时间tzdcorbm1#
当使用cloud-init配置系统时,处理过程中的任何错误都将写入虚拟机文件系统中的cloud-init日志中。这些日志的确切位置取决于AMI的配置,但默认位置是
/var/log/cloud-init.log
。您在问题中显示了两个不同的模板,其中一个包含
for
指令,而另一个仅包含插值。这两种方法都没有遵循从模板生成JSON或YAML中的建议,因此您尝试通过字符串连接生成YAML时可能会生成一些无效的YAML语法或不具有您想要的含义的内容。
下面的模板使用
yamlencode
,以保证结果始终是有效的YAML语法:我还将您的
ssh-authorized-keys
键改为ssh_authorized_keys
,因为这似乎是相关cloud-config示例中使用的名称。如果你使用了一个类似上面的模板,以保证结果是有效的YAML语法,但它仍然不工作,那么这意味着有一些错误的数据表示的YAML,而不是语法的YAML。在这种情况下,你需要参考你的虚拟机中的cloud-init日志,看看发生了什么,当它试图解释你的cloud-config数据结构。