SSH Include指令管理大型集群配置的核心是模块化分层:主配置仅设Host *默认策略和绝对路径Include语句,具体Host块全置于~/.ssh/config.d/下按00-global、10-environments、20-clusters、90-personal分层组织,支持通配符匹配与嵌套Include,需严格权限600且路径不展开变量。
用 SSH 的
指令管理大型集群配置,核心是把“一堆混在一起的 Host 块”变成“按场景分层、可独立维护的小文件”。主配置只管通用策略和加载顺序,具体主机全交给
下的模块处理,既避免冲突,也方便团队协作和 Git 管理。
主配置极简化:只设默认行为 + 引入路径
你的
应该非常干净,类似这样:
开头定义所有连接共用的基础参数,比如:
紧接着只写
行,例如:
不写任何具体服务器的
块——它们全部放在子文件里
子配置按用途分层组织,支持嵌套
推荐在
下建立清晰目录结构:
:放
全局设置,如默认用户、密钥验证方式、连接复用参数(
等)
:按环境拆分,如
、
,每份只管该环境下的主机别名和密钥
:按系统类型分,如
、
,可用通配符批量匹配:
或
目录:放临时调试用的配置,加注释说明有效期,不提交到共享仓库
子文件本身还能再
,比如
可以包含:
路径与权限必须严格合规,否则静默失效
不接受相对路径或变量展开,且对权限敏感:
路径必须是绝对路径,例如:
✅
❌(会直接忽略)
通配符
只支持单层,不递归;不能写
所有被包含的文件(包括主
)权限必须是
:
不支持
或
在引号内展开,
必须裸写在路径开头
配合工具链,真正落地高效运维
模块化不是为拆而拆,关键要让日常操作更顺:
VS Code Remote-SSH 插件自动识别全部
文件,连接面板里直接看到所有别名
终端执行
,OpenSSH 按加载顺序逐个匹配,取首个命中块——所以通用规则放前面,具体主机放后面
新增一台生产数据库节点?只需在
末尾加一段:
搭配
和跳板机配置,可在
中统一定义堡垒机,其他主机通过
复用
Includeconfig.d/~/.ssh/configHost * IdentitiesOnly yes ServerAliveInterval 60 StrictHostKeyChecking askIncludeInclude ~/.ssh/config.d/00-global.confInclude ~/.ssh/config.d/10-environments/*.confInclude ~/.ssh/config.d/20-clusters/*.confInclude ~/.ssh/config.d/90-personal.confHost~/.ssh/config.d/00-global.confHost *ControlMaster auto10-environments/prod.confstaging.conf20-clusters/k8s-control.confhdfs-nn.confHost k8s-node-?? HostName k8s-node-%h.internal.example.com90-personal.confdiscard/Includehomelab.confInclude homelab/devices/*.confInclude homelab/services/*.confIncludeInclude ~/.ssh/config.d/cloud.confInclude config.d/cloud.conf***/*.confconfig600chmod 600 ~/.ssh/configchmod 600 ~/.ssh/config.d/*.conf${HOME}~~Includessh db-prod-0310-environments/prod.confHost db-prod-03 HostName 10.10.50.3 User dbadmin IdentityFile ~/.ssh/id_ed25519-prod-dbProxyJumpproxy.confProxyJump proxy-bastion