如何在远程执行中引入重新启动选项-Terraform



我正在运行 terraform 脚本来创建 vm 并安装软件包(有些软件包未如下面的脚本所示(。安装某些软件包后,我想重新启动 vm,然后再次继续下一步以安装其他软件包。我只是提到有助于理解问题的示例脚本。有人可以建议如何做吗?

inline = [
"chmod +x /tmp/script.sh",
"sudo /tmp/script.sh",
]
}```
Example script.sh as below.
```#!/bin/bash
# install nginx
apt-get update
reboot
apt-get -y install nginx
# make sure nginx is started
service nginx start

执行"/tmp/terraform_1234501241.sh"时出错:等待:远程命令退出,没有退出状态或退出信号

有人可以帮忙吗?

我提供了一种不同的方法来重新启动之前和之后引导。

由于您在云中使用 EC2 实例,因此您应该有权访问 cloud-init。事实上,它通常已经融入了 Debian 和 Ubuntu EC2 映像中。

EC2 具有用户数据的概念,您可以在启动时将其传递给实例。这些数据可以驱动云初始化,在EC2的情况下,甚至可以是在启动时运行的常规shell脚本。我们还可以将 cloud-init 设置为在每次启动时运行 https://aws.amazon.com/premiumsupport/knowledge-center/execute-user-data-ec2/。

将其与remote-exec配置器结合使用,您可以将脚本拆分为初始启动脚本和仅在初始脚本完成后运行的启动脚本。

假设如下:

resource "aws_instance" "my_host" {
instance_type = "t1.micro"
ami = "ami-00a208c7cdba991ea"
count = 1
key_name = var.aws_key_name
security_groups = "my-tsgsting"
user_data = file("script2.sh")
provisioner "remote-exec" {
inline = [
"chmod +x /tmp/script1.sh",
"sudo /tmp/script1.sh",
]
}
}

您的script1.sh会在重新启动之前写出一个文件:

#!/bin/bash
sudo apt-get update
sudo apt-get install nginx -y
# make sure nginx is started
sudo systemctl enable nginx.service
sudo systemctl start nginx.service
sudo touch /etc/.script1-complete
sudo shutdown -r now

您的script2.sh将是一条多部分消息,该消息将 cloud-init 设置为运行每次启动,并将脚本设置为检查顶部是否存在逻辑删除文件:

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
#cloud-config
cloud_final_modules:
- [scripts-user, always]
--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
#!/bin/bash
if [ ! -f /etc/.script1-complete ]; then
echo "Initial script not run yet, exiting"
exit 0
fi
echo "Bootstrapping script2..."
--//

这将删除 Terraform 或 SSH 中所需的任何逻辑,而是依赖于一些现有工具和逻辑删除文件。

我会为此更改脚本

示例 script.sh 如下所示。


# install nginx
sudo apt-get update
sudo apt-get install nginx -y
# make sure nginx is started
sudo systemctl enable nginx.service
sudo systemctl start nginx.service
sudo shutdown -r now

我认为您需要创建一个等待语句,以便在 VM 启动后代码就会知道。 您可以点击此链接编写代码 https://serverfault.com/questions/152795/linux-command-to-wait-for-a-ssh-server-to-be-up

与其他资源建立显式依赖关系,这些资源将获取重新启动任务的输出

您可以在remote-exec中执行此操作,使用shutdown -r 1,它将正确退出,然后重新启动。但是,您必须等待整整一分钟才能再次访问节点,这并不理想。

相反,您可以使用此类local-exec

provisioner "local-exec" {
command = <<-EOT
ssh ${local.ssh_args} root@${self.ipv4_address} '(sleep 2; reboot)&'; sleep 3
until ssh ${local.ssh_args} -o ConnectTimeout=2 root@${self.ipv4_address} true 2> /dev/null
do
echo "Waiting for node to reboot and become available..."
sleep 3
done
EOT
}

最新更新