Terraform remote-exec не удалось загрузить сценарий: отказано в разрешении scp: /tmp

#amazon-ec2 #terraform #terraform-provider-aws

#amazon-ec2 #terraform #terraform-provider-aws

Вопрос:

Я сильно борюсь с local-exec с помощью Terraform. Я развертываю экземпляр EC2 с собственным встроенным AMI из amazon-linux-2.

У меня есть этот код:

 locals {
  ssh_user_home = "/home/ec2-user"
}

resource "null_resource" "rerun" {
  triggers = {
    rerun = uuid()
  }


  provisioner "file" {
    source      = "${path.module}/sources"
    destination = "${local.ssh_user_home}/tmp"

    connection {
      type        = "ssh"
      user        = "${var.aws_ssh_user}"
      private_key = "${data.aws_secretsmanager_secret_version.kibana_proxy_ssh_value.secret_string}"
      host        = "${aws_instance.logstash.private_ip}"
    }
  }

  provisioner "file" {
    source      = "./creds"
    destination = "${local.ssh_user_home}/tmp"

    connection {
      type        = "ssh"
      user        = "${var.aws_ssh_user}"
      private_key = "${data.aws_secretsmanager_secret_version.kibana_proxy_ssh_value.secret_string}"
      host        = "${aws_instance.logstash.private_ip}"
    }
  }

  provisioner "remote-exec" {
    inline = [

      "cd ${local.ssh_user_home}/tmp",
      "cp creds/.htpasswd.${var.aws_env} creds/.htpasswd",
      "bash -x sources/ansible.sh ${var.es_fqdn} ${var.kibana_domain}",
      # "rm -r /tmp/creds/",
      # "rm -r /tmp/sources/",
    ]

    connection {
      type        = "ssh"
      user        = "${var.aws_ssh_user}"
      private_key = "${data.aws_secretsmanager_secret_version.kibana_proxy_ssh_value.secret_string}"
      host        = "${aws_instance.logstash.private_ip}"
      #script_path = "${local.ssh_user_home}"
    }
  }
}

  

Всегда возникает эта ошибка:

 module.logstash-instance.null_resource.rerun (remote-exec): Connecting to remote host via SSH...
module.logstash-instance.null_resource.rerun (remote-exec):   Host: 10.135.202.29
module.logstash-instance.null_resource.rerun (remote-exec):   User: ec2-user
module.logstash-instance.null_resource.rerun (remote-exec):   Password: false
module.logstash-instance.null_resource.rerun (remote-exec):   Private key: true
module.logstash-instance.null_resource.rerun (remote-exec):   Certificate: false
module.logstash-instance.null_resource.rerun (remote-exec):   SSH Agent: false
module.logstash-instance.null_resource.rerun (remote-exec):   Checking Host Key: false
mmodule.logstash-instance.null_resource.rerun (remote-exec): Connected!

Failed to upload script: scp: /tmp: Permission denied
  

Понятия не имею, что я делаю не так, поскольку terraform использует ec2-user в качестве пользователя, и все копируется в /home/ec2-user/tmp

Комментарии:

1. script_path = "${local.ssh_user_home}" должен быть путь к файлу, а не к каталогу.

2. ОК. Я скорректировал свой код, поскольку мне нужен удаленный исполнитель для выполнения команд, определенных в inline =

3. Итак, теперь это работает так, как ожидалось?

4. Нет, потому что у меня проблема с отказом в разрешении. Проблема заключается в проходе удаленного исполнителя.

5. Не могли бы вы попробовать однострочный статический встроенный скрипт, чтобы подтвердить, что встроенное содержимое не вызывает этого?

Ответ №1:

ваша проблема в том, что вам нужно выполнить chmod x для файла, который вы хотите запустить. У файла нет разрешений для запуска в качестве скрипта после копирования туда.

поставщик «remote-exec» {

 connection {
  type        = "ssh"
  user        = "root"
  host        = hcloud_server.derms_lab_server[count.index].ipv4_address
  private_key = file("~/.ssh/id_rsa")
}

inline = [
  "chmod 700 /tmp/get_up_grafana_container.sh",
  "/tmp/get_up_grafana_container.sh"
]
  

}

Ответ №2:

Я обнаружил проблему. Amazon linux 2 защищен таким образом, что он не позволяет использовать ssh из внешнего источника из коробки. Я не нашел решения для смягчения этого ограничения, но я использовал user_data (с cloud-init, что означает, что экземпляр ec2 запускает сценарий user_data после перезагрузки), и теперь все работает 🙂