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

oyt4ldly  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(113)

所以我有以下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映像,代码用于虚拟机。谢谢。

tzdcorbm

tzdcorbm1#

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

相关问题