Я предлагаю другой подход к начальной загрузке до и после перезагрузки.
Поскольку вы используете экземпляр EC2 в облаке, у вас должен быть доступ к cloud-init . Фактически, он обычно запекается в образы Debian и Ubuntu EC2.
EC2 имеет концепцию Пользовательские данные , которую вы можете передать экземпляру во время загрузки. Эти данные могут запускать cloud-init, а в случае EC2 это может быть даже обычный сценарий оболочки, который запускается при запуске. Мы также можем настроить 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..."
--//
Это удаляет все необходимые логики c в Terraform или S SH и вместо этого опирается на некоторые существующие инструменты и файл надгробия.