我正试图使用Terraform provisionerremote-exec
在ec2实例上安装Nginx,但我一直遇到这个错误。
ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain
这就是我的代码看起来像
resource "aws_instance" "nginx" {
ami = data.aws_ami.aws-linux.id
instance_type = "t2.micro"
key_name = var.key_name
vpc_security_group_ids = [aws_security_group.allow_ssh.id]
connection {
type = "ssh"
host = self.public_ip
user = "ec2-user"
private_key = file(var.private_key_path)
}
provisioner "remote-exec" {
inline = [
"sudo yum install nginx -y",
"sudo service nginx start"
]
}
}
安全组规则设置为允许从任何位置进行ssh。我可以通过ssh从本地机器进入盒子。
不确定我是否真的错过了这里很明显。我试过Terraform的新版本,但问题是一样的。
如果您的EC2实例正在为使用cloudinit的操作系统使用AMI(大多数Linux发行版的默认映像都是这样(,那么您可以通过使用user_data
参数将脚本传递给cloud-init:来避免Terraform通过SSH登录
resource "aws_instance" "nginx" {
ami = data.aws_ami.aws-linux.id
instance_type = "t2.micro"
key_name = var.key_name
vpc_security_group_ids = [aws_security_group.allow_ssh.id]
user_data = <<-EOT
yum install nginx -y
service nginx start
EOT
}
对于包含cloud-init的操作系统,系统将运行cloud-init作为系统启动的一部分,并访问元数据和用户数据API以检索user_data
的值。然后,它将执行脚本的内容,将该操作中的任何消息写入云初始化日志。
我上面描述的是关于如何运行命令来设置计算实例的官方建议。文档中说,提供程序是最后的手段,给出的原因之一是为了避免必须正确配置SSH连接和身份验证的额外复杂性,这正是导致您提出这个问题的复杂性,因此我认为尝试遵循文档中的建议是解决这个问题的最佳方法