首页 > 解决方案 > 在 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中没有看到这一点。

标签: jenkins-pipelinepacker

解决方案


事实证明security_group,我的 Packer 使用了错误的方法builder。它可以在我的机器上运行,但 Jenkins 奴隶使用不同的安全组。一旦我将它设置为那个 SG,它就起作用了。


推荐阅读