ssh include指令支持模块化配置,自7.3版起可用,按加载顺序覆盖同名设置,推荐按00-global、10-environments、20-clusters、90-personal分层组织,协同连接复用与通配符提升集群运维效率。

SSH 的 Include 指令是管理大型集群 OpenSSH 客户端配置的关键能力,它让原本臃肿的 ~/.ssh/config 可以模块化、分层化、可复用,避免重复和冲突,也便于团队协同维护。
Include 指令的基本用法与生效规则
OpenSSH 7.3+ 版本起原生支持 Include,允许在主配置文件中引入其他配置文件。语法简单:
-
Include ~/.ssh/config.d/*.conf—— 支持通配符,按字母序加载所有匹配文件 -
Include /etc/ssh/config.d/team-a.conf—— 绝对路径或相对路径(相对于当前 config 文件所在目录) - 被包含的文件格式与主 config 完全一致,同样支持
Host块、参数、注释 - 配置按加载顺序覆盖:后加载的同名 Host 设置会覆盖先加载的(例如全局默认值可被具体环境配置覆盖)
面向集群的典型目录结构设计
针对几十台以上节点的集群(如 Kubernetes 工作节点、Hadoop 集群、CI 构建机群),推荐如下组织方式:
-
~/.ssh/config:仅保留最顶层的通用策略和 Include 声明 -
~/.ssh/config.d/00-global.conf:设置Host *全局默认项(如User,ServerAliveInterval,StrictHostKeyChecking) -
~/.ssh/config.d/10-environments/:按环境拆分,如prod.conf、staging.conf、dev.conf -
~/.ssh/config.d/20-clusters/:按集群命名,如k8s-control.conf、hdfs-nn.conf、spark-worker.conf -
~/.ssh/config.d/90-personal.conf:个人调试专用(如跳板机、堡垒机、临时测试机),不提交到共享仓库
这种结构让新增一个生产数据库节点,只需在 prod.conf 中追加一段 Host db-prod-03 配置,无需动主文件或影响其他环境。
配合密钥与连接复用提升集群操作效率
大型集群中频繁连接不同节点时,单独为每台机器管理密钥和连接开销不可持续。Include 可协同解决:
- 在
00-global.conf中统一启用连接复用:ControlMaster autoControlPath ~/.ssh/control/%r@%h:%pControlPersist 1h - 在各环境配置中指定专属密钥:
Host web-prod-*IdentityFile ~/.ssh/id_ed25519-web-prod - 使用通配符 Host 匹配批量主机:
Host k8s-node-??HostName k8s-node-%h.internal.example.com
(配合 DNS 或 hosts 解析,ssh k8s-node-05即自动解析为完整域名)
团队协作与版本控制实践建议
当多个工程师共管同一套集群时,Include 是实现配置即代码(GitOps)的基础:
- 将
~/.ssh/config.d/目录纳入 Git 仓库(排除90-personal.conf和私钥文件) - 通过符号链接同步配置:
ln -sf ~/dotfiles/ssh/config.d ~/.ssh/config.d - CI 流水线可校验配置语法:
ssh -F ~/.ssh/config -G dummy-host 2>/dev/null || echo "config syntax error" - 敏感信息(如跳板机密码登录)不写入共享配置,而是保留在本地
90-personal.conf并设PasswordAuthentication yes
不复杂但容易忽略:Include 不支持嵌套 Include,所以不要在被包含文件里再写 Include;也不支持变量或模板,需靠文件拆分和通配符来达成灵活性。










