如何在 Jenkisfile 中进行用户输入以进行 terraform apply?
How to do user input in Jenkisfile to carry on with terraform apply?
我正在 运行使用 Jenkinsfile
进行 Jenkins 管道作业。主要目的是运行 terraform <plan|apply>
,根据选择参数到select要么plan
或 apply
,像这样:
stages {
stage('tf_run') {
steps {
sh '''#!/usr/bin/env bash
terragrunt ${Action} --terragrunt-source "/var/temp/tf_modules//${tfm}"
'''
}
}
}
其中 Action
是选择参数变量,它对 计划 都很好,但对 apply 因为它要求确认是否继续,工作立即下降。我可以在这里做什么,以便用户可以键入 yes
/no
(或列表中的 select),然后可以将其传递给 terraform apply
?
我卡在中间了,如果有人能给我指明正确的方向,我将不胜感激。感谢您提供的任何帮助。
-S
您可以在 Jenkins 作业中使用 terraform apply -auto-approve
。
提示:当用户选择参数计划时,您可以在 Jenkins stage() 中添加条件,这样不会自动添加 -auto-approve 选项,否则命令将附加 -auto-approve 选项。
stage(plan&apply){
if ${USER_INPUT} == "plan"{
terraform plan
}
else{
terraform apply -auto-approve
}
}
注意:以上 Jenkins 代码可能与正确的答案不匹配,但可以作为示例。
为了适应用例,Jenkins 管道将分为三个步骤:
- 生成计划文件
- 查询用户输入以批准计划
- 如果获得批准,应用计划文件
假设:您声称 plan
的管道是成功的,这对我来说意味着 Action
和 tfm
是环境变量(即 env.Action
),否则sh
步骤方法的字符串参数无效。鉴于该假设:
(答案现已根据要求进行修改,以证明 tfm
作为管道参数并且不再位于 env
对象中)
parameters {
string(name: 'tfm', description: 'Terraform module to act upon.')
}
stages {
stage('TF Plan') {
steps {
// execute plan and capture plan output
sh(
label: 'Terraform Plan',
script: "terragrunt plan -out=plan.tfplan -no-color --terragrunt-source '/var/temp/tf_modules//${params.tfm}'"
)
}
}
stage('TF Apply') {
// only execute stage if apply is desired
when { expression { return env.Action == 'apply' } }
steps {
// query for user approval of plan
input(message: 'Click "proceed" to approve the above Terraform Plan')
// apply the plan if approved
sh(
label: 'Terraform Apply',
script: 'terraform apply -auto-approve -input=false -no-color plan.tfplan'
)
}
}
}
您可能还想将 env.TF_IN_AUTOMATION = true
的等效项添加到 environment
指令。这在管道中执行 Terraform 时很有用。
如果您也将管道 agent
修改为例如将 Terraform CLI 映像 运行 作为容器,那么计划输出文件也需要在各个阶段之间保存。
我正在 运行使用 Jenkinsfile
进行 Jenkins 管道作业。主要目的是运行 terraform <plan|apply>
,根据选择参数到select要么plan
或 apply
,像这样:
stages {
stage('tf_run') {
steps {
sh '''#!/usr/bin/env bash
terragrunt ${Action} --terragrunt-source "/var/temp/tf_modules//${tfm}"
'''
}
}
}
其中 Action
是选择参数变量,它对 计划 都很好,但对 apply 因为它要求确认是否继续,工作立即下降。我可以在这里做什么,以便用户可以键入 yes
/no
(或列表中的 select),然后可以将其传递给 terraform apply
?
我卡在中间了,如果有人能给我指明正确的方向,我将不胜感激。感谢您提供的任何帮助。
-S
您可以在 Jenkins 作业中使用 terraform apply -auto-approve
。
提示:当用户选择参数计划时,您可以在 Jenkins stage() 中添加条件,这样不会自动添加 -auto-approve 选项,否则命令将附加 -auto-approve 选项。
stage(plan&apply){
if ${USER_INPUT} == "plan"{
terraform plan
}
else{
terraform apply -auto-approve
}
}
注意:以上 Jenkins 代码可能与正确的答案不匹配,但可以作为示例。
为了适应用例,Jenkins 管道将分为三个步骤:
- 生成计划文件
- 查询用户输入以批准计划
- 如果获得批准,应用计划文件
假设:您声称 plan
的管道是成功的,这对我来说意味着 Action
和 tfm
是环境变量(即 env.Action
),否则sh
步骤方法的字符串参数无效。鉴于该假设:
(答案现已根据要求进行修改,以证明 tfm
作为管道参数并且不再位于 env
对象中)
parameters {
string(name: 'tfm', description: 'Terraform module to act upon.')
}
stages {
stage('TF Plan') {
steps {
// execute plan and capture plan output
sh(
label: 'Terraform Plan',
script: "terragrunt plan -out=plan.tfplan -no-color --terragrunt-source '/var/temp/tf_modules//${params.tfm}'"
)
}
}
stage('TF Apply') {
// only execute stage if apply is desired
when { expression { return env.Action == 'apply' } }
steps {
// query for user approval of plan
input(message: 'Click "proceed" to approve the above Terraform Plan')
// apply the plan if approved
sh(
label: 'Terraform Apply',
script: 'terraform apply -auto-approve -input=false -no-color plan.tfplan'
)
}
}
}
您可能还想将 env.TF_IN_AUTOMATION = true
的等效项添加到 environment
指令。这在管道中执行 Terraform 时很有用。
如果您也将管道 agent
修改为例如将 Terraform CLI 映像 运行 作为容器,那么计划输出文件也需要在各个阶段之间保存。