如何使用ssh方便地对多应用多主机进行管理

写在前面

上一篇博客《ubuntu-ssh用户名密码登录与证书免密登录》简单地温习了一下使用ssh登录服务器的方法,可以知道通过证书免密登录服务器既方便又安全。不过这种 ssh -i ~/.ssh/id_rsa -p 6004 -l jingwei 0.0.0.0 通过指定证书、端口、用户名、主机IP的方式多少显得有些啰嗦,尤其在运维非常多主机的时候,仅仅把主机IP与证书对应起来就够费事的。本文就ssh的配置文件进行一些探索,看看如何方便地对多主机进行管理。

适用人群

入门√——初级——中级——高级;本文适应入门及以上。

SSH的配置参数

配置参数的来源途径

ssh程序可以从三个途径获取配置参数:

  1. 命令行选型,比如 -i ~/.ssh/id_rsa-p 6004-l jingwei
  2. 用户配置文件,放置在 ~/.ssh/config
  3. 系统配置文件,放置在 /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 字段一样,值也可以直接指定参数代替:

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 目录下为 githubgitlab 准备好对应的密钥就可以了。

当然,为了配置更为灵活,完全可以把 githubgitlab 拆分开来配置,如下:

# 配置 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 集群的多个节点)的简单登录。

参考