运行 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,它就起作用了。