Как ввести опцию перезагрузки в удаленном exe c -Terraform - PullRequest
0 голосов
/ 08 января 2020

Я запускаю сценарий terraform для создания виртуальной машины и установки пакетов (некоторые пакеты не такие, как показано в сценарии ниже). После установки некоторых пакетов я хочу перезагрузить виртуальную машину и снова перейти к следующему шагу, чтобы установить другие Пакеты. Я просто упоминаю пример сценария, который поможет понять проблему. Может кто-нибудь подсказать, как это можно сделать?

    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": wait: удаленная команда вышла без статуса выхода или сигнала выхода

Может кто-то помочь.

Ответы [ 3 ]

1 голос
/ 09 января 2020

Я предлагаю другой подход к начальной загрузке до и после перезагрузки.

Поскольку вы используете экземпляр 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 и вместо этого опирается на некоторые существующие инструменты и файл надгробия.

0 голосов
/ 08 января 2020

Я думаю, вам нужно создать оператор ожидания, чтобы код знал, когда виртуальная машина будет работать. Вы можете перейти по этой ссылке, чтобы написать код https://serverfault.com/questions/152795/linux-command-to-wait-for-a-ssh-server-to-be-up

сделать явную зависимость с другим ресурсом, который будет принимать выходные данные вашей задачи перезагрузки

0 голосов
/ 08 января 2020

Я бы изменил сценарий для этого

Пример сценария. 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
...