У меня есть конвейер Azure DevOps, который я использую для Terragrunt CI. Исходные модули Terraform, которые я использую в своем репозитории, хранятся во втором репозитории, поэтому для запуска terragrunt plan вам понадобится ключ SSH. Конвейер выполняет все команды Terragrunt в контейнере Docker, и я добавляю ключи SSH в указанный контейнер, когда он будет построен. Это мой Dockerfile:
FROM devopsinfra/docker-terragrunt:azure-tf-1.5.5-tg-0.50.1
RUN apt-get update
RUN apt-get install -y git
ARG SSH_PRIVATE_KEY
RUN mkdir /root/.ssh/
RUN echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa
RUN touch /root/.ssh/known_hosts
RUN touch /root/.ssh/config
RUN ssh-keyscan -t rsa ssh.dev.azure.com >> /root/.ssh/known_hosts
RUN echo $'Host ssh.dev.azure.com vs-ssh.visualstudio.com \n\
HostkeyAlgorithms +ssh-rsa \n\
IdentityFile ~/.ssh/id_rsa \n\
IdentitiesOnly yes' >> /root/.ssh/config
RUN chmod -R 600 ~/.ssh
Это соответствующая часть моего конвейера ADO:
- task: Docker@1
displayName: 'Building image'
inputs:
command: 'Build an image'
imageName: 'tg-azure-img'
arguments: '--build-arg SSH_PRIVATE_KEY = "$(ado-privatekey)"'
- task: Docker@1
displayName: 'Terragrunt Plan'
inputs:
command: 'Run an image'
imageName: 'tg-azure-img'
qualifyImageName: false
volumes: '$(Pipeline.Workspace)/drop:/code'
envVars: |
ARM_CLIENT_SECRET=$(edsp-terraform-ci-credential)
ARM_CLIENT_ID=$(arm-client-id)
ARM_TENANT_ID=$(arm-tenant-id)
ARM_SUBSCRIPTION_ID=$(arm-subscription-id)
workingDirectory: '/code/subscriptions/${{ parameters.workingDirectory }}'
containerCommand: '/bin/bash run-plan.sh'
runInBackground: false
Фактическое содержимое закрытого ключа поступает из защищенной группы переменных, ссылка на которую находится в верхней части конвейера. Когда я запускаю конвейер, он работает нормально, пока не доходит до той части, где он работает terragrunt plan, после чего я получаю следующую ошибку:
│ Error: Failed to download module
│
│ on main.tf line 1:
│ 1: module "blob-storage-account" {
│
│ Could not download module "blob-storage-account" (main.tf:1) source code
│ from
│ "git::ssh://[email protected]/v3/myorg/modules:
│ error downloading
│ 'ssh://[email protected]/v3/myorg/modules:
│ /usr/bin/git exited with 128: Cloning into
│ '.terraform/modules/blob-storage-account'...
│ Load key "/root/.ssh/id_rsa": error in libcrypto
│ Permission denied, please try again.
│ Permission denied, please try again.
│ [email protected]: Permission denied (password,publickey).
│ fatal: Could not read from remote repository.
│
│ Please make sure you have the correct access rights
│ and the repository exists.
│
╵
Мне удалось найти только людей, у которых были подобные проблемы с конвейерами Github, но ни одна из них не касалась Azure DevOps. Решения Github мне не помогли там, где они были применимы. Я пробовал множество различных перестановок команд chmod, я пробовал кучу вещей с форматом закрытого ключа, используя ssh-агент для управления, но ничего не помогло. Есть идеи?


Загрузить ключ «/root/.ssh/id_rsa»: ошибка в libcrypto
Я могу воспроизвести ту же проблему при использовании аналогичного файла Docker для настройки ssh.
Причина проблемы может заключаться в том, что когда вы используете переменную Pipeline для передачи закрытого ключа ssh в изображение докера (RUN echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa), ключ отображается как однострочное значение. Неверный формат закрытого ключа.
Чтобы решить эту проблему, вы можете сохранить файл закрытого ключа (id_rsa) в защищенных файлах (Конвейеры -> Библиотеки -> защищенные файлы). Затем вы можете загрузить файл id_rsa в Pipeline и КОПИРОВАТЬ/ДОБАВИТЬ его в образ Docker.
Вот шаги:
Шаг 1. Добавьте файл id_rsa для защиты файлов.
Шаг 2. Измените файл docker, чтобы использовать команду ADD для добавления файла id_rsa в образ docker.
Например: ADD id_rsa /root/.ssh/id_rsa
FROM devopsinfra/docker-terragrunt:azure-tf-1.5.5-tg-0.50.1
RUN apt-get update
RUN apt-get install -y git
RUN mkdir /root/.ssh/
ADD id_rsa /root/.ssh/id_rsa
RUN touch /root/.ssh/known_hosts
RUN touch /root/.ssh/config
RUN ssh-keyscan -t rsa ssh.dev.azure.com >> /root/.ssh/known_hosts
RUN echo $'Host ssh.dev.azure.com vs-ssh.visualstudio.com \n\
HostkeyAlgorithms +ssh-rsa \n\
IdentityFile ~/.ssh/id_rsa \n\
IdentitiesOnly yes' >> /root/.ssh/config
RUN chmod -R 600 ~/.ssh
Шаг 3. В Azure Pipeline вы можете использовать задачу Загрузить безопасный файл , чтобы скачать файл id_rsa, и использовать задачу Копировать файлы, чтобы скопировать файл id_rsa по ТОМУ же ПУТИ, что и файл docker.
Вот образец YAML:
steps:
- task: DownloadSecureFile@1
displayName: 'Download secure file'
inputs:
secureFile: 'id_rsa'
- task: CopyFiles@2
displayName: 'Copy Files to: $(build.sourcesdirectory)'
inputs:
SourceFolder: '$(Agent.TempDirectory)'
Contents: 'id_rsa'
TargetFolder: '$(build.sourcesdirectory)/samepathasdockerfile'
- task: Docker@1
displayName: 'Building image'
inputs:
command: 'Build an image'
imageName: 'tg-azure-img'
- task: Docker@1
displayName: 'Terragrunt Plan'
inputs:
command: 'Run an image'
imageName: 'tg-azure-img'
qualifyImageName: false
volumes: '$(Pipeline.Workspace)/drop:/code'
envVars: |
ARM_CLIENT_SECRET=$(edsp-terraform-ci-credential)
ARM_CLIENT_ID=$(arm-client-id)
ARM_TENANT_ID=$(arm-tenant-id)
ARM_SUBSCRIPTION_ID=$(arm-subscription-id)
workingDirectory: '/code/subscriptions/${{ parameters.workingDirectory }}'
containerCommand: '/bin/bash run-plan.sh'
runInBackground: false
В этом случае файл id_rsa будет передан в правильном формате. И Pipeline может работать как положено.
Результат:
Вот и все, спасибо шеф-повару
Я уже видел такие
error in libcryptoна ключе SSH, когда у закрытого ключа SSH нет надлежащего разрыва строки в конце файла. Возможно, стоит попробовать это еще раз проверить.