#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 после перезагрузки), и теперь все работает 🙂