Подготовка хостов
У нас будет два Debian хоста в виде Docker-контейнеров. Так как Ansible будет ругаться на пароли при подключении по SSH, мы сразу настраиваем авторизацию по ключу. Файлы конфигурации контейнеров взяты практически один-в-один из репозитория Praqma/alpine-sshd
.
Создать Dockerfile
внутри containers
:
FROM debian:12
COPY entrypoint.sh /
RUN apt-get update \
&& apt-get install -y openssh-server python3.11 \
&& mkdir /var/run/sshd\
&& mkdir -p /root/.ssh \
&& chmod 0700 /root/.ssh \
&& ssh-keygen -A \
&& sed -i s/^#PasswordAuthentication\ yes/PasswordAuthentication\ no/ /etc/ssh/sshd_config \
&& chmod +x entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["/usr/sbin/sshd", "-D"]
Создать entrypoint.sh
рядом с Dockerfile
:
#!/bin/sh
if [ -z "${AUTHORIZED_KEYS}" ]; then
echo "AUTHORIZED_KEYS env variable is not set. It is required to setup ssh access to the containers."
exit 1
fi
echo "Populating /root/.ssh/authorized_keys with the value from AUTHORIZED_KEYS"
echo "${AUTHORIZED_KEYS}" > /root/.ssh/authorized_keys
# Execute the CMD from the Dockerfile:
exec "$@"
Создать docker-compose.yml
внутри containers
:
version: "3"
services:
deb1:
build: .
environment:
AUTHORIZED_KEYS: ${AUTHORIZED_KEYS}
ports:
- "2222:22"
deb2:
build: .
environment:
AUTHORIZED_KEYS: ${AUTHORIZED_KEYS}
ports:
- "2223:22"
К этому моменту наша рабочая папка выглядит так:
├── .venv
│ └── ...
└── containers
├── Dockerfile
├── docker-compose.yml
└── entrypoint.sh
Установить переменную окружения для ssh-ключей, собрать образы и запустить:
export AUTHORIZED_KEYS=$(cat ~/.ssh/id_rsa.pub)
docker compose up --build
Если всё ок, то в конце вывода будет так:
[+] Running 3/1
⠿ Network containers_default Created
⠿ Container containers-deb2-1 Created
⠿ Container containers-deb1-1 Created
Attaching to containers-deb1-1, containers-deb2-1
containers-deb2-1 | Populating /root/.ssh/authorized_keys with the value from AUTHORIZED_KEYS env variable ...
containers-deb1-1 | Populating /root/.ssh/authorized_keys with the value from AUTHORIZED_KEYS env variable ...
Теперь можно перейти в сосдений терминал и проверить подключение по ssh:
> ssh root@localhost -p 2222
> ssh root@localhost -p 2223
На всякий случай на время обучения можно в ~/.ssh/config
добавить настройку для localhost
, чтобы не было проблем с добавлением ключей в known_hosts
:
Host localhost
StrictHostKeyChecking no