Как выполнять сценарии (удаленный запуск) в ОС, оптимизированной для облачных контейнеров Google, с помощью Terraform

Я знаю, что оптимизированная для контейнеров ОС - это в основном noexec. У меня есть случай, когда мне нужно выполнить несколько простых сценариев в моем домашнем каталоге, скопировать файлы из моего образа докера на хост и т. Д. Когда я вхожу в экземпляр с помощью SSH, с этим проблем не возникает. Но с terraform вроде не работает:

resource "null_resource" "test_upload2" {

    count = length(var.nodes)

    provisioner "remote-exec" {
        connection {
            type     = "ssh"
            host     = google_compute_address.static[count.index].address
            private_key = file("keys/private_key")
            user     = var.admin_username
            script_path = "/home/hyperledger/provision.sh"
        }

        inline = [
        "ls"
        ]
    
    }
    depends_on = [google_compute_instance.peer-blockchain-vm, null_resource.test_upload]

}

Я получаю следующее сообщение об ошибке:

null_resource.test_upload[0] (remote-exec): bash: /home/hyperledger/provision.sh: Permission denied


Error: error executing "/home/hyperledger/provision.sh": Process exited with status 126

Есть ли способ сделать это исключительно с помощью Terraform? Кажется, нехорошо передать эту логику какому-нибудь локальному сценарию оболочки и достичь цели с помощью local-exec.


person Fedor Petrov    schedule 25.08.2020    source источник


Ответы (1)


А пока я нашел решение. Когда я создаю экземпляр, я устанавливаю следующий сценарий запуска:

resource "google_compute_instance" "my_vm" {
...
metadata_startup_script = "mkdir -p /home/hyperledger/tmp/;sudo mount -t tmpfs -o size=100M tmpfs /home/hyperledger/tmp/" 
}

Он создает диск в памяти. Затем путь к сценарию в ресурсе следует переопределить следующим образом:

script_path = "/home/hyperledger/tmp/provision.sh"

Все сценарии в этом временном каталоге могут быть выполнены.

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

    provisioner "remote-exec" {
            connection {
                type     = "ssh"
                private_key = file(var.private_key)
                user     = var.admin_username
                script_path = "/home/hyperledger/tmp/provision.sh"
            }

            inline = [
            "sudo chown -R hyperledger:hyperledger /home/hyperledger"
            ]
        }
person Fedor Petrov    schedule 26.08.2020