#amazon-web-services #docker #jenkins #amazon-s3 #ssh
#amazon-web-services #docker #дженкинс #amazon-s3 #ssh
Вопрос:
Простая цель:
Я хотел бы, чтобы на моем локальном компьютере были запущены два контейнера. Один jenkins
контейнер и один SSH server
контейнер. Затем jenkins job может подключиться к контейнеру SSH-сервера и выполнить команду aws для загрузки файла в S3.
Структура каталогов моего рабочего пространства:
- a
docker-compose.yml
(подробности см. Ниже) - каталог с именем
centos/
, - Внутри
centos/
у меня естьDockerfile
для создания образа SSH-сервера.
Docker-compose.yml:
В моем docker-compose.yml
я объявил два контейнера (службы).
- Один контейнер jenkins, имя
jenkins
. - Один SSH-сервер contaienr, названный
remote_host
.
version: '3'
services:
jenkins:
container_name: jenkins
image: jenkins/jenkins
ports:
- "8080:8080"
volumes:
- $PWD/jenkins_home:/var/jenkins_home
networks:
- net
remote_host:
container_name: remote_host
image: remote-host
build:
context: centos7
networks:
- net
networks:
net:
Dockerfile
Для remote_host
этого это так (обратите внимание, что последний RUN
устанавливает интерфейс командной строки AWS):
FROM centos
RUN yum -y install openssh-server
RUN useradd remote_user amp;amp;
echo remote_user:1234 | chpasswd amp;amp;
mkdir /home/remote_user/.ssh amp;amp;
chmod 700 /home/remote_user/.ssh
COPY remote-key.pub /home/remote_user/.ssh/authorized_keys
RUN chown remote_user:remote_user -R /home/remote_user/.ssh/ amp;amp;
chmod 600 /home/remote_user/.ssh/authorized_keys
RUN ssh-keygen -A
RUN rm -rf /run/nologin
RUN yum -y install unzip
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" amp;amp; unzip awscliv2.zip amp;amp; ./aws/install
Текущая ситуация с вышеуказанной настройкой:
Я запускаю docker-compose build
и docker-compose up
. Оба jenkins
контейнера и контейнер remote_host
(SSH server) успешно запущены.
Я могу зайти внутрь jenkins
контейнера с помощью :
$ docker exec -it jenkins bash
jenkins@7551f2fa441d:/$
Я могу успешно подключиться к контейнеру с помощью remote_host
:
jenkins@7551f2fa441d:/$ ssh -i /tmp/remote-key remote_user@remote_host
Warning: the ECDSA host key for 'remote_host' differs from the key for the IP address '172.19.0.2'
Offending key for IP in /var/jenkins_home/.ssh/known_hosts:1
Matching host key in /var/jenkins_home/.ssh/known_hosts:2
Are you sure you want to continue connecting (yes/no)? yes
[remote_user@8c203bbdcf72 ~]$
Внутри remote_host
контейнера я также настроил свой ключ доступа AWS и секретный ключ в ~.aws/credentials
:
[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Я могу успешно запустить команду aws для загрузки файла из remote_host
контейнера в мою корзину AWS S3. Нравится:
[remote_user@8c203bbdcf72 ~]$ aws s3 cp myfile s3://mybucket123asx/myfile
В чем проблема
Теперь я хотел бы, чтобы мое задание jenkins выполнило команду aws для загрузки файла в S3. Итак, я создал сценарий оболочки внутри своего remote_host
контейнера, сценарий выглядит следующим образом:
#/bin/bash
BUCKET_NAME=$1
aws s3 cp /tmp/myfile s3://$BUCKET_NAME/myfile
В моем jenkins я настроил SSH, а в конфигурации задания jenkins у меня есть:
Как вы можете видеть, он просто запускает скрипт, расположенный в remote_host
контейнере.
Когда я создаю задание Дженкинса, я всегда получаю сообщение об ошибке в консоли : upload failed: ../../tmp/myfile to s3://mybucket123asx/myfile Unable to locate credentials
.
Почему одна и та же команда s3 работает при выполнении в remote_host
контейнере, но не работает при запуске из задания jenkins?
Я также попытался явно экспортировать идентификатор ключа aws и секретный ключ в скрипте. (имейте в виду, что у меня ~.aws/credentils
настроен in remote_host
, который работает без явного экспорта секретного ключа aws)
#/bin/bash
BUCKET_NAME=$1
export aws_access_key_id=AKAARXL1CFQNN4UV5TIO
export aws_secret_access_key=MY_SECRETE_KEY
aws s3 cp /tmp/myfile s3://$BUCKET_NAME/myfile
Комментарии:
1. В последнем примере экспорт должен быть выполнен заглавными буквами, как показано здесь .
2. Для Дженкинса возможно, что скрипты не запускают
remote_user
user. В вашем скрипте вы можете добавитьwhoami
и подтвердить пользователя, который выполняет скрипт?3. Скорее всего, проблема пользователя, как упоминал Марчин. Кстати, в ваших скриптах отсутствует восклицательный знак в верхней строке: он должен быть
#!/bin/bash
. Это, конечно, не корень проблемы с загрузкой.4. Я попробовал предложение @Marcin,
whoami
показывает, что Дженкинс запускает скрипт какremote_user
Ответ №1:
Хорошо, я решил свою проблему, изменив export
оператор на прописной. Итак, причина проблемы в том, что когда Дженкинс запускает скрипт, он запускается как remote_user
вкл remote_host
. Хотя у remote_host
меня есть ~/.aws/credentials
настройка, но у этого файла есть разрешение на чтение только для пользователей, отличных от root
:
[root@8c203bbdcf72 /]# ls -l ~/.aws/
total 4
-rw-r--r-- 1 root root 112 Sep 25 19:14 credentials
Вот почему, когда Дженкинс запускал скрипт для загрузки файла в S3 Unable to locate credentials
, произошел сбой. Потому что файл учетных данных не может быть прочитан remote_user
. Итак, мне все равно нужно раскомментировать строки, которые экспортируют идентификатор ключа aws и секретный ключ. Комментарий @Marcin полезен тем, что буквы должны быть заглавными, иначе это не сработало бы.
Итак, в целом, что я сделал для устранения проблемы, так это обновил мой скрипт с помощью:
export aws_access_key_id=AKAARXL1CFQNN4UV5TIO
export aws_secret_access_key=MY_SECRETE_KEY