Terraform не работает удаленно-exec (aws / ec2)

При попытке выполнить сценарий оболочки throw Provider "remote-exec" в соединении terraform не устанавливается

Я использую ami для ubuntu-xenial-16.04, поэтому пользователь ubuntu

Это последний код, который я использую для выполнения сценария оболочки:

resource "aws_instance" "secondary_zone" {
  count = 1
  instance_type = "${var.ec2_instance_type}"
  ami           = "${data.aws_ami.latest-ubuntu.id}"
  key_name = "${aws_key_pair.deployer.key_name}"
  subnet_id = "${aws_subnet.secondary.id}"
  vpc_security_group_ids =  ["${aws_security_group.server.id}"]
  associate_public_ip_address = true

  provisioner "remote-exec" {
    inline = ["${template_file.script.rendered}"]
  }

  connection {
    type        = "ssh"
    user        = "ubuntu"
    private_key = "${file("~/.ssh/id_rsa")}"
  }
}

Вот что попадает в консоль:

aws_instance.secondary_zone (remote-exec): Connecting to remote host via SSH...
aws_instance.secondary_zone (remote-exec):   Host: x.x.x.x
aws_instance.secondary_zone (remote-exec):   User: ubuntu
aws_instance.secondary_zone (remote-exec):   Password: false
aws_instance.secondary_zone (remote-exec):   Private key: true
aws_instance.secondary_zone (remote-exec):   SSH Agent: false
aws_instance.secondary_zone (remote-exec):   Checking Host Key: false

Спасибо за помощь...


person AvZi    schedule 27.04.2019    source источник
comment
Разрешает ли группа безопасности вашего экземпляра доступ по SSH с вашего компьютера, на котором работает Terraform?   -  person ydaetskcoR    schedule 28.04.2019
comment
да, конечно, я меняю тип провайдера на файл, а затем провайдер remote-exec   -  person AvZi    schedule 29.04.2019
comment
На самом деле это вопрос, относящийся к окружающей среде, поэтому на него будет сложно ответить. Но в качестве контрольного списка вещей, которые стоит попробовать: можете ли вы подключиться к экземпляру по SSH с этой комбинацией пользователя и ключа с машины, на которой запущен Terraform, когда не используется провайдер? Время ожидания соединения истекает при запуске инициатора? Это какая-то ошибка?   -  person ydaetskcoR    schedule 02.05.2019
comment
@ydaetskcoR Думаю, вы правы. когда я пытался применить его из другого места, он подключается нормально. Кроме того, файл_шаблона устарел, поэтому я меняю код. Я разделяю это.   -  person AvZi    schedule 03.05.2019


Ответы (3)


Я была такая же проблема. В блоке подключения попробуйте указать хост.

  connection {
    type        = "ssh"
    user        = "ubuntu"
    private_key = "${file("~/.ssh/id_rsa")}"
    host        = self.public_ip
  }

Мне также пришлось создать маршрут и шлюз и связать их с моим vpc. Я все еще изучаю терраформ, но у меня это сработало.

resource "aws_internet_gateway" "test-env-gw" {
  vpc_id = aws_vpc.test-env.id
}

resource "aws_route_table" "route-table-test-env" {
  vpc_id = aws_vpc.test-env.id
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.test-env-gw.id
  }
}

resource "aws_route_table_association" "subnet-association" {
  subnet_id      = aws_subnet.us-east-2a-public.id
  route_table_id = aws_route_table.route-table-test-env.id
}
person Charlie    schedule 18.06.2020

Как я уже упоминал, в моем случае это была проблема с подключением.

Вдобавок template_file устарел, поэтому я изменил код на:

resource "aws_instance" "secondary_zone" {
  instance_type = "${var.ec2_instance_type}"
  ami           = "${data.aws_ami.latest-ubuntu.id}"
  key_name = "${aws_key_pair.deployer.key_name}"
  subnet_id = "${aws_subnet.secondary.id}"
  vpc_security_group_ids =  ["${aws_security_group.server.id}"]
  associate_public_ip_address = true

    connection {
    type     = "ssh"
    user = "ubuntu"
    private_key = "${file("~/.ssh/id_rsa")}"
    timeout = "2m"

  }

  provisioner "file" {
    source      = "/server/script.sh"
    destination = "/tmp/script.sh"
  }  

  provisioner "remote-exec" {
    inline = [
      "chmod +x /tmp/script.sh",
      "/tmp/script.sh args",
    ]
  }
}

Кроме того, я узнал, что файл scrip.sh должен быть отформатирован как LR

person AvZi    schedule 03.05.2019
comment
Я не думаю, что этот ответ действительно решает вопрос, и ваш вопрос в основном по своей сути не имеет ответа, кроме как открыть свою группу безопасности / другие сетевые политики для экземпляра, чтобы разрешить SSH с машины, на которой запущен Terraform - person ydaetskcoR; 03.05.2019
comment
На самом деле, я почти уверен, что это не так. Решение здесь, но недостаточно, чтобы кто-то заметил. Это работает из-за строки private_key в разделе подключения. - person Software Engineer; 08.05.2019

Если вы просто пытаетесь запустить несколько сценариев для подготовки любых узлов ec2, которые вы создаете с помощью Terraform, я бы попытался установить параметр user-data для ссылки на ваш сценарий. Сценарий пользовательских данных запускается автоматически при инициализации узла.

Это обеспечит отсутствие проблем, связанных с жизненным циклом вашего развертывания (таких как создание узла EC2 и недоступность хоста для успешного выполнения удаленным исполнителем), а также общее удобство работы.

Пример этого может выглядеть так:

resource "aws_instance" "secondary_zone" {
  count = 1
  instance_type = "${var.ec2_instance_type}"
  ami           = "${data.aws_ami.latest-ubuntu.id}"
  key_name = "${aws_key_pair.deployer.key_name}"
  subnet_id = "${aws_subnet.secondary.id}"
  vpc_security_group_ids =  ["${aws_security_group.server.id}"]
  associate_public_ip_address = true

  user_data = "${template_file.script.rendered}"
}

Надеюсь это поможет!

Дополнительная литература: TF docs Примеры пользовательских данных

person Jin    schedule 30.01.2020