如何在Ansible执行环境中指定SSH配置与密钥?
问题描述
我正在搭建Ansible执行环境,却找不到指定SSH配置与密钥的正确方式。我想要用的SSH配置条目如下:
Host <host> User root ProxyCommand /bin/bash -c "ssh -o 'PubkeyAcceptedKeyTypes +ssh-rsa' root@<domain> -W [%h]:%p" IdentityFile /runner/.ssh/<keyfile> IdentitiesOnly yes
我尝试通过以下构建步骤把配置添加到执行环境:
additional_build_steps: prepend_base: - COPY _build/configs/config /etc/ssh/ssh_config.d/ - RUN chmod 700 /etc/ssh/ssh_config.d - RUN chmod 600 /etc/ssh/ssh_config.d/* - RUN chown 1000 -R /etc/ssh/ssh_config.d
同时在对应inventory里配置:
vars: ansible_ssh_common_args: '-F /etc/ssh/ssh_config.d/config' ansible_ssh_private_key_file: '~/.ssh/<keyfile>'
结果出现报错:
no such identity: /runner/.ssh/<keyfile>: No such file or directory
我认为配置已经成功加到镜像并被使用,但密钥文件没挂载。我有两个问题:
- 这是向Ansible执行环境添加SSH配置的正确/推荐方式吗?
- 如何正确挂载/添加所需的SSH密钥到执行环境?
解决方案
1. 添加SSH配置的正确方式
你当前的方法是可行的,但有几个优化点:
- 不需要手动修改
ssh_config.d的权限和属主,Ansible执行环境默认用UID 1000的用户,/etc/ssh/ssh_config.d本身一般已有可读权限,只要保证你的配置文件权限为600就行。 - 更推荐把SSH配置放在用户专属目录
/runner/.ssh/config,而非系统级的/etc/ssh/ssh_config.d/。/runner是执行环境的用户工作目录,这样配置更贴合用户上下文,也能避免系统级目录的权限问题。修改后的构建步骤如下:
additional_build_steps: prepend_base: - RUN mkdir -p /runner/.ssh - COPY _build/configs/config /runner/.ssh/config - RUN chmod 700 /runner/.ssh - RUN chmod 600 /runner/.ssh/config - RUN chown 1000:1000 -R /runner/.ssh
同时inventory里的ansible_ssh_common_args可以删掉,因为Ansible会自动读取用户目录下的SSH配置。
2. 挂载/添加SSH密钥的正确方法
报错的核心是/runner/.ssh/<keyfile>不存在,有两种可行方案:
方案一:运行时挂载密钥(推荐)
不要把密钥打包进执行环境镜像(有安全风险),而是在运行Ansible命令时,通过卷挂载本地密钥到执行环境的/runner/.ssh/目录:
ansible-navigator run playbook.yml \ --eep my-execution-env \ --volume ~/.ssh/<keyfile>:/runner/.ssh/<keyfile>:ro \ --volume ~/.ssh/known_hosts:/runner/.ssh/known_hosts:ro
这种方式安全又灵活,密钥不会被固化到镜像里。
方案二:构建时添加密钥(仅适用于测试环境)
如果是测试场景,且能确保密钥文件安全,可以在构建步骤中添加:
additional_build_steps: prepend_base: - RUN mkdir -p /runner/.ssh - COPY _build/configs/config /runner/.ssh/config - COPY _build/keys/<keyfile> /runner/.ssh/<keyfile> - RUN chmod 700 /runner/.ssh - RUN chmod 600 /runner/.ssh/config /runner/.ssh/<keyfile> - RUN chown 1000:1000 -R /runner/.ssh
注意:生产环境绝对禁止这种方式,镜像会包含敏感私钥,一旦泄露会引发安全问题。
另外,你inventory里的ansible_ssh_private_key_file配置可以删掉,因为SSH配置里已经指定了IdentityFile,Ansible会遵循SSH配置的设置。
内容的提问来源于stack exchange,提问作者Shade
相关产品推荐
相关产品推荐

