Как сохранить постоянную оболочку удаленного исполнения terraform? - PullRequest
0 голосов
/ 07 ноября 2019

Добрый день,

Я готовлю виртуальные машины из шаблона на vSphere с Terraform. После запуска виртуальных машин поставщик файлов копирует локальный статический контент (изображения). Как только это будет сделано, поставщик удаленного exec сделает это:

provisioner "remote-exec" {
     inline = [
       "mkdir /home/foo/static",
       "mv /home/foo/logo.jpg /home/foo/static/",
       "echo 'python /home/foo/app.py 2>&1 &' > /home/foo/start_app.sh",
       "chmod u+x /home/foo/start_app.sh",
       "/home/foo/start_app.sh 2>&1",
       "sleep 60"
     ]
}

app.py - это проект Python Flask. Код запускается и обслуживает контент нормально ... в течение примерно 60 секунд. Когда мой таймер сна истекает, я подозреваю, что оболочка, порожденная Terraform, умирает, как и app.py. Я попытался запустить start_app.sh в фоновом режиме, я попытался sudoing (передний план и фон) безрезультатно. Такое же поведениеЕсли я запускаю python /home/foo/app.py непосредственно внутри блока remote-exec, а не вызываю start_app.sh, то TF никогда не выходит из оболочки, и моя сборка Jenkins продолжает вращаться вечно.

У меня нетЯ думаю, что это имеет какое-то значение, но чтобы быть полным, мой план TF VMware применяется, когда Git отправляет webhook Дженкинсу. Дженкинс вызывает план TF как часть стадии конвейера. Вот вывод консоли от Jenkins:

vsphere_virtual_machine.vm[1]: Provisioning with 'file'...
vsphere_virtual_machine.vm[1]: Provisioning with 'remote-exec'...
vsphere_virtual_machine.vm[1] (remote-exec): Connecting to remote host via SSH...
vsphere_virtual_machine.vm[1] (remote-exec):   Host: 1.1.1.200
vsphere_virtual_machine.vm[1] (remote-exec):   User: foo
vsphere_virtual_machine.vm[1] (remote-exec):   Password: true
vsphere_virtual_machine.vm[1] (remote-exec):   Private key: false
vsphere_virtual_machine.vm[1] (remote-exec):   SSH Agent: false
vsphere_virtual_machine.vm[1] (remote-exec):   Checking Host Key: false
vsphere_virtual_machine.vm[1] (remote-exec): Connected!
vsphere_virtual_machine.vm[1] (remote-exec):  * Serving Flask app "app" (lazy loading)
vsphere_virtual_machine.vm[1] (remote-exec):  * Environment: production
vsphere_virtual_machine.vm[1] (remote-exec):    WARNING: This is a development server. Do not use it in a production deployment.
vsphere_virtual_machine.vm[1] (remote-exec): [2m   Use a production WSGI server inst
vsphere_virtual_machine.vm[1] (remote-exec):  * Debug mode: off
vsphere_virtual_machine.vm[1] (remote-exec):  * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
vsphere_virtual_machine.vm.1: Still creating... (8m30s elapsed)
vsphere_virtual_machine.vm.0: Still creating... (8m30s elapsed)
vsphere_virtual_machine.vm.1: Still creating... (8m40s elapsed)
vsphere_virtual_machine.vm.0: Still creating... (8m40s elapsed)
vsphere_virtual_machine.vm.1: Still creating... (8m50s elapsed)
vsphere_virtual_machine.vm.0: Still creating... (8m50s elapsed)
vsphere_virtual_machine.vm.1: Still creating... (9m0s elapsed)
vsphere_virtual_machine.vm.0: Still creating... (9m0s elapsed)
vsphere_virtual_machine.vm.1: Still creating... (9m10s elapsed)
vsphere_virtual_machine.vm.0: Still creating... (9m10s elapsed)
vsphere_virtual_machine.vm[0]: Creation complete after 9m15s (ID: 4228d941-a19c-361d-073a-4441cde5973e)

Как я могу сохранить оболочку, порожденную TF, постоянной после того, как удаленный exec TF сделан?

1 Ответ

0 голосов
/ 07 ноября 2019

ОК - Я нашел действительно ужасный взлом. Terraform больше не запускает remote-exec, он просто выталкивает мое приложение на Python Flask и связанный с ним статический контент с помощью поставщика файлов. Внутри Jenkins у меня есть этап, который выглядит следующим образом:

def remote = [:]
remote.name = "1.1.1.200"
remote.host = "1.1.1.200"
remote.allowAnyHosts = true

node {
    withCredentials([usernamePassword(credentialsId: 'sshUserAccount', passwordVariable: 'password', usernameVariable: 'userName')]) {
        remote.user = userName
        remote.password = password
        stage("SSH Steps Rocks!") {
            try {
              timeout(time: 1, unit: 'MINUTES') {
                sshCommand remote: remote, command: '/home/foo/start_app.sh &' 
              }
            } catch (err){
               currentBuild.result = 'SUCCESS'
              }
        }
   }
}

Как только SSH-поток Jenkins завершает свою работу через одну минуту, мое приложение python продолжает работать на удаленной машине. Ура! Это просто для лабораторной демонстрации, а не то, что я хотел бы сделать в Prod. Я бы использовал пользовательские шаблоны как предложено.

...