如何使用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 集群的多个节点)的简单登录。