#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, он сработал.