You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

我认为配置已经成功加到镜像并被使用,但密钥文件没挂载。我有两个问题:

  1. 这是向Ansible执行环境添加SSH配置的正确/推荐方式吗?
  2. 如何正确挂载/添加所需的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:07:16