如何在Userdata中使用Terraform变量?SSH公钥传递异常排查
问题解决:Terraform templatefile传参到cloud-config未生效
核心问题
你的userdata.yaml中使用$public_key的变量引用方式不符合Terraform templatefile函数的语法规范,该函数仅识别${变量名}格式的插值标记,所以$public_key不会被替换为实际的公钥值,导致cloud-config无法读取到正确的密钥。
修复步骤
1. 修改userdata.yaml的变量引用
将yaml文件中的$public_key替换为${public_key}:
#cloud-config users: - default - name: testuser sudo: ALL=(ALL) NOPASSWD:ALL ssh_authorized_keys: - ${public_key} shell: /bin/bash packages: - jq
2. 验证模板渲染结果(可选)
在终端中执行terraform console,输入以下命令测试templatefile的输出是否正确替换了变量:
templatefile("./userdata.yaml", { public_key = "你的测试公钥内容" })
如果输出中已经将${public_key}替换为实际的公钥字符串,说明模板配置正确。
3. 重新部署
执行terraform apply重新部署虚拟机,此时testuser的authorized_keys文件应该能正确写入指定的公钥。
额外注意事项
- 确保
master_public_keys变量中的公钥内容是完整的SSH公钥字符串(以ssh-rsa或ecdsa-sha2-nistp256等开头) - 如果公钥内容包含特殊字符,可将
${public_key}用双引号包裹,避免yaml解析异常:ssh_authorized_keys: - "${public_key}"
内容的提问来源于stack exchange,提问作者PrestonDocks
相关产品推荐
相关产品推荐

