如何通过Dockerfile为容器配置SSH密钥以测试Ansible
两种自动化配置容器SSH连接的方案
针对你在M1 Mac上用容器搭建Ansible控制端/目标端的需求,这里提供两种通过Dockerfile实现SSH密钥自动配置的方案:
方案一:构建镜像时自动生成并注入密钥对
这种方案无需本地预先生成密钥,全程通过Docker构建流程完成密钥生成与配置。
1. 目标端(target)Dockerfile
FROM alpine:latest # 安装openssh并配置sshd允许root密钥登录 RUN apk add --no-cache openssh \ && mkdir -p /root/.ssh \ && chmod 700 /root/.ssh \ && echo "PermitRootLogin yes" >> /etc/ssh/sshd_config \ && echo "PasswordAuthentication no" >> /etc/ssh/sshd_config \ && ssh-keygen -A # 通过构建参数注入控制端公钥 ARG SSH_PUB_KEY RUN echo "$SSH_PUB_KEY" > /root/.ssh/authorized_keys \ && chmod 600 /root/.ssh/authorized_keys EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]
2. 控制端(controller)Dockerfile
FROM alpine:latest # 安装openssh和ansible RUN apk add --no-cache openssh ansible # 生成无密码SSH密钥对 RUN ssh-keygen -t ed25519 -f /root/.ssh/id_ed25519 -N "" # 导出公钥到临时文件,方便构建时提取 RUN cat /root/.ssh/id_ed25519.pub > /tmp/controller.pub CMD ["/bin/sh"]
3. 构建与启动步骤
# 构建控制端镜像并提取公钥到本地 docker build -t ansible-controller . -f Dockerfile.controller docker run --rm ansible-controller cat /tmp/controller.pub > controller.pub # 用提取的公钥构建目标端镜像 docker build -t ansible-target . -f Dockerfile.target --build-arg SSH_PUB_KEY="$(cat controller.pub)" # 创建网络并启动容器 docker network create localnet docker run -d --name target --network localnet ansible-target docker run -it --name controller --network localnet ansible-controller
启动后在控制端容器内直接执行 ssh root@target 即可连接。
方案二:本地生成密钥,构建时注入容器
这种方案将密钥保存在本地,可重复使用,适合需要固定密钥的场景。
1. 本地生成无密码密钥对
ssh-keygen -t ed25519 -f ./ansible_key -N ""
2. 目标端Dockerfile
FROM alpine:latest RUN apk add --no-cache openssh \ && mkdir -p /root/.ssh \ && chmod 700 /root/.ssh \ && echo "PermitRootLogin yes" >> /etc/ssh/sshd_config \ && echo "PasswordAuthentication no" >> /etc/ssh/sshd_config \ && ssh-keygen -A # 复制本地公钥到容器授权列表 COPY ansible_key.pub /root/.ssh/authorized_keys RUN chmod 600 /root/.ssh/authorized_keys EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]
3. 控制端Dockerfile
FROM alpine:latest RUN apk add --no-cache openssh ansible # 复制本地私钥到容器 COPY ansible_key /root/.ssh/id_ed25519 RUN chmod 600 /root/.ssh/id_ed25519 # 可选:提前添加目标端到known_hosts,避免首次连接确认 RUN echo "target ssh-ed25519 $(cat ansible_key.pub | awk '{print $2}')" >> /root/.ssh/known_hosts CMD ["/bin/sh"]
4. 构建与启动步骤
# 构建镜像 docker build -t ansible-target . -f Dockerfile.target docker build -t ansible-controller . -f Dockerfile.controller # 创建网络并启动容器 docker network create localnet docker run -d --name target --network localnet ansible-target docker run -it --name controller --network localnet ansible-controller
关键注意事项
- Alpine系统的sshd默认禁止root登录,必须在配置中添加
PermitRootLogin yes - SSH密钥文件权限必须为600,密钥目录权限必须为700,否则会被SSH服务拒绝
- 若不想手动处理known_hosts,可在控制端启动时执行
ssh-keyscan target >> /root/.ssh/known_hosts
内容的提问来源于stack exchange,提问作者hardik-ddod
相关产品推荐
相关产品推荐

