Запуск сценария упаковщика в конвейере Jenkins?

#jenkins-pipeline #packer

#дженкинс-конвейер #упаковщик

Вопрос:

Packer v1.6.6

У меня есть следующий шаблон упаковщика, который создает AMI для Jenkins. Как вы можете видеть, у него есть 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": []
}
 

Теперь у меня есть конвейер Дженкинса, который использует шаблон. Я сохранил файл закрытого ключа SSH в своем плагине учетных данных. Вы видите, где я устанавливаю 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 
            amp;amp; export JENKINS_MASTER_IMAGE_VERSION=$env.JENKINS_VERSION 
            amp;amp; 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 эту опцию -o StrictHostKeyChecking=no , но я не вижу этого в документах SSH Communicator.

Комментарии:

1. Попробуйте выполнить настройку PACKER_LOG=1 в конвейере, снова запустите конвейер и посмотрите, почему происходит сбой ssh. Кроме того, вероятно, было бы проще использовать шаблон source_ami_filter в шаблоне упаковщика, чем интерфейс командной строки AWS в JP.

2. Хороший совет по source_ami_filter настройке.

3. Добавление PACKER_LOG=1 на самом деле не дало больше информации о сбое.

Ответ №1:

Оказывается, я использовал неправильный security_group для своего упаковщика builder . Он работает на моей машине, но подчиненные устройства Jenkins используют другую группу безопасности. Как только я установил его на этот SG, он сработал.