Terraform:EC2 实例仍在 运行 shell 脚本之后使用供应器创建
Terraform: EC2 instance is still creating after running shell script using provisioner
我需要 Terraform 导出的一些帮助。
我将创建 EC2 实例并使用 terraform 在其上安装一些包。
为了安装包,我使用了 terraform 的 provisiner。这是 EC2 实例部分。
resource "aws_instance" "lms_server" {
ami = var.AMI
instance_type = var.instance_type
key_name = var.private_key
iam_instance_profile = aws_iam_instance_profile.instance_profile.name
associate_public_ip_address = true
subnet_id = aws_subnet.main-public-1.id
vpc_security_group_ids = [aws_security_group.security_rule.id]
provisioner "file" {
source = "script.sh"
destination = "/tmp/script.sh"
}
provisioner "remote-exec" {
inline = [
"chmod +x /tmp/script.sh",
"/tmp/script.sh ${var.gh_user} ${var.gh_token} ${var.gh_url} ${aws_db_instance.lms_mysql_db.address} ${var.db_name} ${var.db_username} ${var.db_password} ${aws_sqs_queue.lms_queue.id} ${var.sqs_name} ${self.public_ip} ${var.aws_region} ${var.bucket_name}",
]
}
connection {
type = "ssh"
host = "${self.public_ip}"
user = var.user_name
private_key = "${file("lms_key.pem")}"
}
root_block_device {
volume_size = var.volume_size
}
tags = {
lms_app = "lms_server"
}
}
正如您在此处看到的,我通过 SSH 访问 EC2 并复制了包含所有命令的 script.sh
文件。那就运行吧。我认为 EC2 已成功创建并安装了所有软件包,但 terraform CLI 保持 ec2 instance: still creating
状态。
这意味着 EC2 实例的创建还没有完成。所以如果我再次放下这个(Ctrl+C
)然后 运行 terraform apply
,它曾经再次从第一个开始销毁和创建实例。它还会再次安装所有软件包。
每次我为其他而不是 EC2 更新 terraform 脚本时都会发生此操作。
我期待就此问题获得一些帮助。
感谢您的时间和考虑。
你能给我们看看 scripts.sh 的内容吗?也许有什么东西让该脚本继续执行以致于它无法完成。
您可以尝试使用 user_data。在 bootstrap 阶段创建 EC2 并将其记录在 EC2 中后,它将 运行 您的脚本。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance#user_data
我需要 Terraform 导出的一些帮助。 我将创建 EC2 实例并使用 terraform 在其上安装一些包。 为了安装包,我使用了 terraform 的 provisiner。这是 EC2 实例部分。
resource "aws_instance" "lms_server" {
ami = var.AMI
instance_type = var.instance_type
key_name = var.private_key
iam_instance_profile = aws_iam_instance_profile.instance_profile.name
associate_public_ip_address = true
subnet_id = aws_subnet.main-public-1.id
vpc_security_group_ids = [aws_security_group.security_rule.id]
provisioner "file" {
source = "script.sh"
destination = "/tmp/script.sh"
}
provisioner "remote-exec" {
inline = [
"chmod +x /tmp/script.sh",
"/tmp/script.sh ${var.gh_user} ${var.gh_token} ${var.gh_url} ${aws_db_instance.lms_mysql_db.address} ${var.db_name} ${var.db_username} ${var.db_password} ${aws_sqs_queue.lms_queue.id} ${var.sqs_name} ${self.public_ip} ${var.aws_region} ${var.bucket_name}",
]
}
connection {
type = "ssh"
host = "${self.public_ip}"
user = var.user_name
private_key = "${file("lms_key.pem")}"
}
root_block_device {
volume_size = var.volume_size
}
tags = {
lms_app = "lms_server"
}
}
正如您在此处看到的,我通过 SSH 访问 EC2 并复制了包含所有命令的 script.sh
文件。那就运行吧。我认为 EC2 已成功创建并安装了所有软件包,但 terraform CLI 保持 ec2 instance: still creating
状态。
这意味着 EC2 实例的创建还没有完成。所以如果我再次放下这个(Ctrl+C
)然后 运行 terraform apply
,它曾经再次从第一个开始销毁和创建实例。它还会再次安装所有软件包。
每次我为其他而不是 EC2 更新 terraform 脚本时都会发生此操作。
我期待就此问题获得一些帮助。 感谢您的时间和考虑。
你能给我们看看 scripts.sh 的内容吗?也许有什么东西让该脚本继续执行以致于它无法完成。
您可以尝试使用 user_data。在 bootstrap 阶段创建 EC2 并将其记录在 EC2 中后,它将 运行 您的脚本。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance#user_data