Назад | Перейти на главную страницу

terraform выполнить скрипт bash в экземпляр

Каким способом выполняется сценарий sh в экземпляре ec2, когда terraform создает ресурсы? Я создал ami с некоторыми файлами в каталоге для выполнения, если я войду через ssh, я могу выполнить файл следующим образом:

sh /home/resources/wso/bin/wso.sh

У меня есть файл start.tpl со следующим содержанием:

#!/bin/bash

# update ubuntu
sudo apt-get update
# install nginx
sudo apt-get install nginx -y
sudo service nginx start

#start wso2
sh /home/resources/wso/bin/wso.sh

В моем main.tf у меня есть это:

data "template_file" "start" {
  template = "${file("start.tpl")}"  
}

resource "aws_instance" "wnginx" {
  ami                    = "${var.instance_ami}"
  instance_type          = "${var.instance_type}"    
  user_data = "${data.template_file.start.rendered}"
}

Nginx запускается хорошо, но мой стартовый скрипт wso.sh не запускается.

Есть ли какая-то конфигурация terraform для отладки моего start.tpl?

Вы неправильно используете пользовательские данные. Посмотри пожалуйста документация cloud-init.

Ваш шаблон должен содержать что-то вроде этого (формат YAML):

#cloud-config
write_files:
- path: /home/resources/wso/bin/wso.sh
    content: |
    #!/bin/bash

    # update ubuntu
    sudo apt-get update
    # install nginx
    sudo apt-get install nginx -y
    sudo service nginx start
runcmd:
- ["sh", "/home/resources/wso/bin/wso.sh"]

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

#cloud-config
packages:
  - nginx
package_update: true
runcmd:
  - [systemctl, daemon-reload]
  - [systemctl, enable, nginx]
  - [systemctl, start, nginx]

Он достигнет того же уровня, что и ваш сценарий, но использует предоставленную Систему для подготовки машины, а также устранит необходимость, например. для поддержки собственного AMI, так как тогда вы можете просто применить конфигурацию cloud-init через пользовательские данные и полагаться на образы Debian / Ubuntu.

Если это не помогло, вы можете проверить /var/log/cloud-init.log. Поскольку формат файла - YAML, помните, что он может быть нарушен из-за неправильного отступа.

Кажется, это не совсем связано с терраформом. Механизм пользовательских данных - это функция EC2. Для отладки пользовательских данных вы можете проверить /var/log/ и найдите файлы с именем cloud-init. По крайней мере, в образах на основе CentOS / AWS есть файл с именемcloud-init-output который содержит stdout / stderr сценария пользовательских данных.

Другой способ - использовать terraforms remote-exec provisioner, который позволяет выполнять команды из terraform на удаленной машине.

https://www.terraform.io/docs/provisioners/remote-exec.html

Чтобы проверить содержимое визуализированного сценария, у вас есть несколько возможностей:

  • запустите terraform plan и проверьте результаты
  • проверьте данные пользователя из консоли EC2
  • использовать, например, null_ressource с поставщиком local-exec, который выводит визуализированный шаблон, например, с помощью echo или cat.