Para probar papeles ansibles, necesito un contenedor de muelles que corre sistematizado o init - un contenedor en el que se pueden habilitar los servicios. También necesito que este contenedor sea accesible a través de ssh. De esta manera, no tengo que girar los recursos de la nube (que no son libres) para probar hacer algo en un remoto.
Hay algunas desventajas para usar un contenedor de docker para esto, incluso para la prueba. No cabe duda de que es complicado. Si necesita instalar docker en un contenedor docker, puede encontrarse con dificultades. Especialmente en mac os x, que no tiene grupos. En mac os x no es posible montar cgroups en un contenedor de muelles:
## not possible:
docker run -d --privileged \
--name systemd-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
-v /tmp/systemd-journal:/var/log/journal \
-v /etc/machine-id:/etc/machine-id:ro \
my-systemd-imagePorque... / sys/fs/cgroup no existe. (Y si me equivoco en esta evaluación, por favor marquelo en los comentarios!)
Ahora, es posible rodear esta limitación. Y para el propósito de la prueba ansible con molécula, una imagen ubuntu que permite sshd ya se mantiene:geerlingguy/docker-debian11-ansible:latest
Sin embargo, preferí salir por mi cuenta, basado en ubuntu. Aquí está mi ficha:
## Dockerfile-sshd
FROM ubuntu:22.04
RUN apt update && \
apt install -y \
apt-utils \
build-essential \
curl \
libcurl4-openssl-dev \
nginx nodejs \
python3 \
screen shared-mime-info ssh \
tree \
vim
RUN mkdir -p /run/sshd
expose 80
CMD ["/usr/sbin/sshd", "-D"]Usualmente instalo más paquetes de lo que se justifica - sintiéndome libre de eliminar paquetes que considera innecesario. Yo personalmente prefiero todas las comodidades que se instalan en todas partes.
Entonces construirías la imagen, sustituyendo mi etiqueta por la tuya:
docker build . -f Dockerfile-sshd -t piousbox/ubuntu-ssh:0.0.13La forma en que ejecuto el contenedor, es que tengo un directorio local volumen/root/ que monta como /root en el contenedor. Tiene llaves de ssh ~/.ssh/authorized keys para iniciar sesión como root - para que las teclas no sean parte de la imagen. Al mismo tiempo también proveo ~/.screenrc y ~/.bash aliases (y relevantes) ~/.bashrc ) archivos para conveniencia. La estructura de los volúmenes/raíz es:
volumes/root/
.bashrc
.bash_aliases
.ssh/
authorized_keys
.screenrcEl contenido de autorizados keys son las claves públicas de ssh, una por línea:
cat ~/.ssh/my-key.pub >> volumes/root/.ssh/authorized_keysComo calidad de mejora de la vida, añado el *nombre* de la clave como la *email tag* en la clave pública. Y nunca renomino las llaves. De esta manera, por lo general sé qué clave estoy mirando, si estoy mirando sólo la firma pública:
cat ~/.ssh/my-key.pub
ssh-rsa AAAAB3NzaC1yc...3Ccn95xzZW4TQiRxVoNkz= victor+my-key@wasya.coPor último, empiezo el contenedor de docker-compose:
## docker-compose.yml
version: '3.2'
services:
ant_1:
image: piousbox/ubuntu-sshd:0.0.14
init: true
ports:
- 9001:80 ## https
- 9101:22 ## ssh
restart: 'unless-stopped'
volumes:
- type: bind
source: volumes/root
target: /root
- type: bind
source: volumes/letsencrypt/live
target: /etc/letsencrypt/live
- type: bind
source: volumes/sites-available
target: /etc/nginx/sites-enabled
...Omitiendo una configuración para brevedad. Llamo a los contenedores locales de prueba "ganantes".
docker-compose up -d ant_1Con esta configuración, puedo introducirme en el contenedor, ya sea manualmente o con automatización como la molécula ansible:
ssh -i ~/.ssh/my-key root@127.0.0.1 -p 9101.^.