运行 Jenkins 管道中的 Packer 脚本?
Running a Packer script in a Jenkins pipeline?
Packer v1.6.6
我有以下 Packer 模板,它为 Jenkins 创建了一个 AMI。如您所见,它有 SSH_PRIVATE_KEY
个变量。
{
"variables" : {
"aws_access_key" : "{{ env `AWS_ACCESS_KEY` }}",
"aws_secret_key" : "{{ env `AWS_SECRET_KEY` }}",
"ssh_private_key" : "{{ env `SSH_PRIVATE_KEY` }}",
"aws_ami_us_east_1" : "{{ env `AWS_BASE_AMI` }}",
"jenkins_master_image_version" : "{{ env `JENKINS_MASTER_IMAGE_VERSION` }}"
},
"builders" : [
"ssh_username" : "ec2-user",
"ssh_keypair_name" : "my-key-pair",
"ssh_private_key_file" : "{{ user `ssh_private_key` }}",
...
],
"provisioners": []
}
现在我有一个使用该模板的 Jenkins 管道。我已将 SSH 私钥文件存储在我的凭据插件中。你看我在哪里设置了 Packer 模板使用的 SSH_PRIVATE_KEY
变量。
stage("Create Jenkins AMI") {
steps {
script {
withCredentials([file(credentialsId: "my-key-pair-pem", variable: "SSH_PRIVATE_KEY")]) {
dir("$env.WORKSPACE/deployment/jenkins/packer") {
sh """
export AWS_BASE_AMI=ami-123456abcdef \
&& export JENKINS_MASTER_IMAGE_VERSION=$env.JENKINS_VERSION \
&& packer build jenkins-ami-master.json
"""
}
}
}
}
}
当我 运行 作业时,它会为 运行 我的供应商创建临时实例,但无法通过 SSH 连接到它。我得到
+ export AWS_BASE_AMI=ami-0be2609ba883822ec
+ export JENKINS_MASTER_IMAGE_VERSION=lts
+ packer build jenkins-ami-master.json
[1;32mamazon-ebs output will be in this color.[0m
[1;32m==> amazon-ebs: Prevalidating AMI Name: packer-jenkins-master-somedate[0m
[0;32m amazon-ebs: Found Image ID: ami-123456abcedf[0m
[1;32m==> amazon-ebs: Using existing SSH private key[0m
[1;32m==> amazon-ebs: Launching a source AWS instance...[0m
[1;32m==> amazon-ebs: Adding tags to source instance[0m
[0;32m amazon-ebs: Adding tag: "Name": "packer-builder-jenkins-master"[0m
[0;32m amazon-ebs: Instance ID: i-0ceb4376846c69[0m
[1;32m==> amazon-ebs: Waiting for instance (i-0ceb4376846c69) to become ready...[0m
[1;32m==> amazon-ebs: Using ssh communicator to connect: 10.23.x.x[0m
[1;32m==> amazon-ebs: Waiting for SSH to become available...[0m
[1;31m==> amazon-ebs: Timeout waiting for SSH.[0m
[1;32m==> amazon-ebs: Terminating the source AWS instance...[0m
[1;32m==> amazon-ebs: Cleaning up any extra volumes...[0m
[1;32m==> amazon-ebs: No volumes to clean up, skipping[0m
[1;31mBuild 'amazon-ebs' errored: Timeout waiting for SSH.[0m
==> Some builds didn't complete successfully and had errors:
--> amazon-ebs: Timeout waiting for SSH.
让打包程序在我的管道中使用我的 SSH 密钥凭据的正确方法是什么?
注意 我非常确定我使用的是正确的 ssh 凭据,因为我可以使用相同的凭据手动 ssh 到临时实例。此外,我可以在我的本地终端上执行相同的 CLI 并且它有效。
更新。似乎我需要以某种方式将选项 -o StrictHostKeyChecking=no
传递给 Packer,但我在 SSH Communicator 文档中没有看到。
事实证明我为我的 Packer builder
使用了错误的 security_group
。它在我的机器上运行,但 Jenkins 奴隶使用不同的安全组。一旦我将它设置为那个 SG,它就起作用了。
Packer v1.6.6
我有以下 Packer 模板,它为 Jenkins 创建了一个 AMI。如您所见,它有 SSH_PRIVATE_KEY
个变量。
{
"variables" : {
"aws_access_key" : "{{ env `AWS_ACCESS_KEY` }}",
"aws_secret_key" : "{{ env `AWS_SECRET_KEY` }}",
"ssh_private_key" : "{{ env `SSH_PRIVATE_KEY` }}",
"aws_ami_us_east_1" : "{{ env `AWS_BASE_AMI` }}",
"jenkins_master_image_version" : "{{ env `JENKINS_MASTER_IMAGE_VERSION` }}"
},
"builders" : [
"ssh_username" : "ec2-user",
"ssh_keypair_name" : "my-key-pair",
"ssh_private_key_file" : "{{ user `ssh_private_key` }}",
...
],
"provisioners": []
}
现在我有一个使用该模板的 Jenkins 管道。我已将 SSH 私钥文件存储在我的凭据插件中。你看我在哪里设置了 Packer 模板使用的 SSH_PRIVATE_KEY
变量。
stage("Create Jenkins AMI") {
steps {
script {
withCredentials([file(credentialsId: "my-key-pair-pem", variable: "SSH_PRIVATE_KEY")]) {
dir("$env.WORKSPACE/deployment/jenkins/packer") {
sh """
export AWS_BASE_AMI=ami-123456abcdef \
&& export JENKINS_MASTER_IMAGE_VERSION=$env.JENKINS_VERSION \
&& packer build jenkins-ami-master.json
"""
}
}
}
}
}
当我 运行 作业时,它会为 运行 我的供应商创建临时实例,但无法通过 SSH 连接到它。我得到
+ export AWS_BASE_AMI=ami-0be2609ba883822ec
+ export JENKINS_MASTER_IMAGE_VERSION=lts
+ packer build jenkins-ami-master.json
[1;32mamazon-ebs output will be in this color.[0m
[1;32m==> amazon-ebs: Prevalidating AMI Name: packer-jenkins-master-somedate[0m
[0;32m amazon-ebs: Found Image ID: ami-123456abcedf[0m
[1;32m==> amazon-ebs: Using existing SSH private key[0m
[1;32m==> amazon-ebs: Launching a source AWS instance...[0m
[1;32m==> amazon-ebs: Adding tags to source instance[0m
[0;32m amazon-ebs: Adding tag: "Name": "packer-builder-jenkins-master"[0m
[0;32m amazon-ebs: Instance ID: i-0ceb4376846c69[0m
[1;32m==> amazon-ebs: Waiting for instance (i-0ceb4376846c69) to become ready...[0m
[1;32m==> amazon-ebs: Using ssh communicator to connect: 10.23.x.x[0m
[1;32m==> amazon-ebs: Waiting for SSH to become available...[0m
[1;31m==> amazon-ebs: Timeout waiting for SSH.[0m
[1;32m==> amazon-ebs: Terminating the source AWS instance...[0m
[1;32m==> amazon-ebs: Cleaning up any extra volumes...[0m
[1;32m==> amazon-ebs: No volumes to clean up, skipping[0m
[1;31mBuild 'amazon-ebs' errored: Timeout waiting for SSH.[0m
==> Some builds didn't complete successfully and had errors:
--> amazon-ebs: Timeout waiting for SSH.
让打包程序在我的管道中使用我的 SSH 密钥凭据的正确方法是什么?
注意 我非常确定我使用的是正确的 ssh 凭据,因为我可以使用相同的凭据手动 ssh 到临时实例。此外,我可以在我的本地终端上执行相同的 CLI 并且它有效。
更新。似乎我需要以某种方式将选项 -o StrictHostKeyChecking=no
传递给 Packer,但我在 SSH Communicator 文档中没有看到。
事实证明我为我的 Packer builder
使用了错误的 security_group
。它在我的机器上运行,但 Jenkins 奴隶使用不同的安全组。一旦我将它设置为那个 SG,它就起作用了。