jenkins-pipeline - 在 Jenkins 管道中运行 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 私钥文件存储在我的凭据插件中。您会看到我在哪里设置SSH_PRIVATE_KEY
了 Packer 模板使用的变量。
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 并且它可以工作。
更新。似乎我需要以某种方式将 Packer 传递给 option ,但我在SSH Communicator文档-o StrictHostKeyChecking=no
中没有看到这一点。
解决方案
事实证明security_group
,我的 Packer 使用了错误的方法builder
。它可以在我的机器上运行,但 Jenkins 奴隶使用不同的安全组。一旦我将它设置为那个 SG,它就起作用了。
推荐阅读
- debugging - Flutter - 如何获取错误代码行:“引发了另一个异常”
- angular - Ionic Firestore CollectionReference.doc() 错误
- c# - 将 .NET ECDSA P1363 签名转换为 Bouncy Castle ASN.1 签名
- java - 收到错误 java.lang.IllegalArgumentException
- android - 如何使用 XPath 根据其子元素查找父元素
- python-3.x - 我如何正则表达式三次方程的系数?
- r - 从字符串中解析每个数字并存储在 R 的新列中
- reactjs - 链接标签不起作用并直接指向要求页面
- python - 解析我的代码时出现意外的EOF?为什么会这样?
- python - 哪个python图形库用于移动点