как сделать экземпляр bootstrap ec2 с внешним файлом сценария в terraform? - PullRequest
1 голос
/ 19 апреля 2020

Может ли кто-нибудь из вас помочь мне с помощью следующего кода в terraform? Я пытаюсь bootstrap экземпляр amazon linux ec2, используя внешний файл сценария. Внешний скрипт устанавливает tomcat на экземпляр ec2. Следующий код не может развернуть tomcat на ec2.

код terrform:

data "template_file" "ec2_user_data" {
  template = "${file("${path.cwd}/user_data_tomcat.txt")}"
}

resource "aws_instance" "lab_ec1" {
  ami = "ami-009d6802948d06e52"
  instance_type = "t2.micro"
  key_name = "lab_keypair_1"
  #key_name = "${aws_key_pair.lab_key_pair.name}"
  subnet_id = "${aws_subnet.lab_subnet1.id}"
  vpc_security_group_ids = [
      "${aws_security_group.lab_bastion_sg.id}",
  ]
  associate_public_ip_address = true
  user_data = "${data.template_file.ec2_user_data.template}"

  tags = {
    Name = "lab_ec1"
  }
}

файл внешнего сценария: user_data_tomcat.txt

#!/bin/bash
sudo yum -y install tomcat.noarch
sudo yum -y install tomcat-admin-webapps.noarch
sudo yum -y install tomcat-webapps.noarch
sudo yum -y install tomcat-lib.noarch
sudo service tomcat start

Ответы [ 3 ]

1 голос
/ 20 апреля 2020

Похоже, что следующая переменная неверна:

user_data = "${data.template_file.ec2_user_data.template}"

Вы должны использовать атрибут rendered вместо template, как описано в следующей ссылке: https://www.terraform.io/docs/providers/template/d/file.html#rendered

0 голосов
/ 20 апреля 2020

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

#!/bin/bash
sudo yum -y install tomcat.noarch
sudo yum -y install tomcat-admin-webapps.noarch
sudo yum -y install tomcat-webapps.noarch
sudo yum -y install tomcat-lib.noarch
sudo service tomcat start

Если нет, он также не может работать как user_data, Убедитесь, что вы проверили его в интерактивном режиме, прежде чем пытаться использовать его как user_data .

. Вы использовали template в user_data, например:

user_data = "${data.template_file.ec2_user_data.template}"

template получит внутренне закодированную версию исходного файла шаблона без замены переменных. У вас нет переменных в шаблоне, поэтому, скорее всего, текстовая кодировка приведет к сбою. Отправка этого как user_data в моем опыте никогда не работает, так как используемая кодировка текста плохо взаимодействует с cloud-init или bash. Вы можете проверить /var/log/cloud-init-output.log на наличие ошибок.

Вместо этого вы должны использовать отрисованный в user_data, например:

user_data = "${data.template_file.ec2_user_data.template}"

Полный блок исправленных ресурсов:

resource "aws_instance" "lab_ec1" {
  ami = "ami-009d6802948d06e52"
  instance_type = "t2.micro"
  key_name = "lab_keypair_1"
  #key_name = "${aws_key_pair.lab_key_pair.name}"
  subnet_id = "${aws_subnet.lab_subnet1.id}"
  vpc_security_group_ids = [
      "${aws_security_group.lab_bastion_sg.id}",
  ]
  associate_public_ip_address = true
  user_data = "${data.template_file.ec2_user_data.rendered}"

  tags = {
    Name = "lab_ec1"
  }
}
0 голосов
/ 20 апреля 2020

вы можете использовать удаленный exe c, но в этом случае я рекомендую использовать userdata https://www.terraform.io/docs/providers/aws/r/instance.html#user_data

user_data = "${data.template_file.ec2_user_data.rendered}"
...