如何使用ssh方便地对多应用多主机进行管理
写在前面
上一篇博客《ubuntu-ssh用户名密码登录与证书免密登录》简单地温习了一下使用ssh登录服务器的方法,可以知道通过证书免密登录服务器既方便又安全。不过这种 ssh -i ~/.ssh/id_rsa -p 6004 -l jingwei 0.0.0.0 通过指定证书、端口、用户名、主机IP的方式多少显得有些啰嗦,尤其在运维非常多主机的时候,仅仅把主机IP与证书对应起来就够费事的。本文就ssh的配置文件进行一些探索,看看如何方便地对多主机进行管理。
适用人群
入门√——初级——中级——高级;本文适应入门及以上。
SSH的配置参数
配置参数的来源途径
ssh程序可以从三个途径获取配置参数:
- 命令行选型,比如
-i ~/.ssh/id_rsa,-p 6004,-l jingwei; - 用户配置文件,放置在
~/.ssh/config; - 系统配置文件,放置在
/etc/ssh/ssh_config(区别于/etc/ssh/sshd_config)。
上面三个途径,前面的途径传入的参数可以覆盖后面的途径传入的参数(与 linux 里的大部分应用类似)。因为/etc/ssh/ssh_config 会影响 ssh 全局的配置,因此如果想对多主机进行管理(不影响别人的情况下),可以考虑修改自己家目录下的~/.ssh/config 文件(~ 字符表示当前登录用户的家目录)。
配置文件
首先看一个配置文件的 demo :
# cat ~/.ssh/config
Host docker*
HostName 0.0.0.0
User jingwei
IdentityFile ~/.ssh/id_rsa
Port 6004
当在 ~/.ssh/config 配置了上面的内容后,就可以通过 ssh docker 快速登录到我在 docker 中启动的容器了。接下来我们依次看一下配置文件中包含哪些项。
Host 字段
Host 字段配置了登录别名,比如 ssh docker 表示使用别名为 docker 的配置登录远端的服务器。这里需要注意的是,Host 是支持通配符的, * 代表0~n个非空白字符,? 代表一个非空白字符,! 表示例外通配。
HostName 字段
指定远程主机名,可以直接使用 IP 地址。如果这个字段中包含 ‘%h’ ,则实际使用时会被命令行中的主机名替换。比如 demo 中如果设置 HostName 0.0.0.0.%h,在运行 ssh docker 后,会把主机名解析为 0.0.0.0.docker。
User 字段
指定登录用户名。
IdentityFile 字段
指定密钥认证使用的私钥文件路径。默认为 ~/.ssh/id_dsa,或 ~/.ssh/id_rsa。这个字段可以指定多个密钥文件(以 , 分开),在连接的过程中会依次尝试这些密钥文件。和 HostName 字段一样,值也可以直接指定参数代替:
- %d,本地用户目录 ~
- %u,本地用户
- %l,本地主机名
- %h,远程主机名 (下面的示例中将主要使用这个参数)
- %r,远程用户名
Port 字段
指定远程主机端口号,默认为 22 。
几个实例
gitlab与github一起使用
# 配置 config 文件如下所示
# cat ~/.ssh/config
Host git*
HostName %h.com
IdentityFile ~/.ssh/%h_rsa
User git
按照上面的配置,当敲 ssh github 命令时,等价于 ssh -i ~/.ssh/github_rsa git@github.com;当敲 ssh gitlab 命令时, 等价于 ssh -i ~/.ssh/gitlab_rsa git@gitlab.com。也就是说,只需要在 ~/.ssh 目录下为 github 和 gitlab 准备好对应的密钥就可以了。
当然,为了配置更为灵活,完全可以把 github 与 gitlab 拆分开来配置,如下:
# 配置 config 文件如下所示
# cat ~/.ssh/config
Host opensource
HostName github.com
IdentityFile ~/.ssh/pem-1
User git1
Host working
HostName gitlab.com
IdentityFile ~/.ssh/smile-1
User smile
有规律的主机配置
Host 1*
HostName 172.231.%h
User smile
IdentityFile ~/.ssh/cluster-rsa
Port 22
对于一些基础设施(比如 K8s),一个集群会涉及到很多的节点,比如所有的节点在 172.231.1.0/24 网段,那么可以通过上面的配置实现敲 ssh 1.10 登录到 172.231.1.10 主机的目的。那么本地只需要维护一个机器与主机IP的列表即可。
小结
本文介绍了 ssh 配置文件的用法,通过一些简单的配置来实现对不同应用(比如 github、github)和不同主机(比如一个 k8s 集群的多个节点)的简单登录。