问题描述
在使用Terraform和cloud-init启动EC2实例时,遇到了cloud-init脚本无法运行的问题。他正在按照Terraform教程中的步骤进行操作,但在尝试使用OpenSSH私钥从CLI登录实例时,出现了”Permission denied (publickey,gssapi-keyex,gssapi-with-mic)”的错误。用户怀疑这可能是由于公钥未上传到实例导致的。他还尝试将AMI更改为Linux 2,但仍然遇到相同的错误。用户想知道是否有什么明显的问题。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
问题分析
根据用户提供的信息,我们可以看到cloud-init脚本存在一些问题:
– #groups
被注释掉了,导致下面的列表使其成为无效的YAML。
– 即使我们取消注释groups,- ubuntu: [root,sys]
也是无效的,因为默认用户已经有了一个组规范。
– 在runcmd中,sudo su
在脚本中不起作用。相反,你应该使用sudo -u <user>
来为单个用户运行单个命令。此外,不需要使用sudo获取root权限,因为所有用户脚本都已经以root身份运行。
解决方案
修复上述问题后,我们将得到一个修复后的cloud-init脚本,如下所示:
#cloud-config
# Add the empty group hashicorp.
groups:
- hashicorp
# Add users to the system. Users are added after groups are added.
users:
- default
- name: terraform
gecos: terraform
shell: /bin/bash
primary_group: hashicorp
sudo: ALL=(ALL) NOPASSWD:ALL
groups: users, admin
lock_passwd: false
ssh_authorized_keys:
- ssh rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCMT6uYfhWx8jOmiGR9ryIPKcWy2ceqvyZ4Q4+q5QTiZtlbWxbP37YZnT8uQhyjB4QRR1cjOyvGKC3Zu0Isy0eHIx2lGm/7B04bsoWWAUqhJmYWMZlivnHtJJJ4P5gnvXiRNmFg9iK07C7ClggNBAQZZHUeA5wcnvvHT/pDkGUjMUqgLvmWRJqJM9qLT717e229F1Fyh+sYtAj08qmcFF1JCs2D33R46RQ8YBMpQqmWLfjuJDUrjdvMu7Mv3aPpaeUWuYoC90iHR9XMeNonrtRlx21nY3CoMZ0AOpeNl999UzyMJrsvN4qm6byK2Pc6jrEyKr9jI8SvMEGdSWgqr/Hd
# Downloads the golang package
packages:
- golang-go
# Sets the GOPATH & downloads the demo payload
runcmd:
- mkdir /home/terraform/go
- chown terraform:hashicorp /home/terraform/go
- GOPATH=/home/terraform/go -u terraform go install github.com/hashicorp/learn-go-webapp-demo@latest
请注意,你需要将公钥的格式更改为单行,以确保它是有效的YAML。
其他建议
- 确保你使用正确的私钥,以PEM格式提供。
- 尝试在渲染之前在terraform的file函数周围添加”${}”,如下所示:
data "template_file" "init_script" {
template = "${file("../scripts/add-ssh-web-app.yaml")}"
}
希望这些解决方案能帮助到你解决问题。如果你有任何其他问题,请随时提问。
正文完