大概从大二的时候开始就有这种困惑:不同的服务器所在的云服务商,数据中心,网段,用户名和私钥各不相同,他们的信息要如何管理?最开始是把所有的服务器信息都存放在了密码管理工具当中,后来知道了使用 assh 来生成 ssh_config,最后是 @Aspire 提供的一个思路:使用脚本生成 hosts 文件。于是我顺着 Aspire 的思路开发了一个工具:Tiresias,它可以读取事先写好的 YAML 配置文件并生成 ssh_confighosts 文件。今天这篇文章就主要介绍一下我造的又一个轮子。

介绍

Tiresias,一般翻译为特伊西亚斯,古希腊神话人物,是一位盲人先知,凭借多种获得信息的能力并对世界进行解释而闻名于世。这个工具取这个名字主要就是采用了盲人先知的意象,希望它可以更好帮助管理众多服务器的信息。

使用

Tiresias 不需要特别的安装过程,只需要从 release 处下载编译好的二进制即可使用。

Tiresias 运行时需要指定一个配置文件,比如:

src:
  - type: fs
    path: /path/to/source/file

dst:
  - type: ssh_config
    path: /home/xuanwo/.ssh/config
  - type: hosts
    path: /etc/hosts

src 目前支持 fs 类型,可以指向一个 yaml 配置文件:

# production server
- name: production-server
  address: 1.1.1.1
  user: root
  identity_file: ~/.ssh/private_key
# staging server
- name: staging-server
  address: 2.2.2.2
  user: root
  identity_file: ~/.ssh/private_key

dst 目前支持 ssh_confighosts 类型,可以通过 path 指定生成文件的地址。以刚才的输入为例,将会分别生成如下两个文件:

# -- Generated by tiresias at 2018-05-22 13:35:35.669119377 +0800 CST m=+0.002915397 --
Host production-server
    HostName 1.1.1.1
    User root
    IdentityFile ~/.ssh/private_key

Host staging-server
    HostName 2.2.2.2
    User root
    IdentityFile ~/.ssh/private_key
# -- Generated by tiresias at 2018-05-22 13:35:35.669429758 +0800 CST m=+0.003225739 --
1.1.1.1 production-server
2.2.2.2 staging-server

配合上 shell 提供的自动补全功能,我们就可以这样使用了:

$ ping production-server
$ ssh staging-server
$ redis-cli -h production-server
$ mysql -h staging-server -u root -p

实现

Tiresias 实现上并不复杂,分别定义了 SourceDestnation 两个 interface,然后从 Source 读取数据并写入到 Destnation。

展望

  • 配合 systemd.path 或者 inotify 可以实现文件变更之后的自动更新
  • 支持从更多的 Source 中读取数据,比如一个 url,etcd 或者是 Keyring
  • 支持向更多的 Destnation 中写入数据,比如写入到 Keyring 或者密码管理器
  • 支持 Server name 的通配符以支持配置批量服务器

总结

Tiresias 以一种非侵入式的方式实现了服务器信息的管理和应用,使得用户只需要维护一个固定的源就能方便快捷的维护自己的所有服务器,不会产生任何非预期的行为。

动态

  • 上个周末一直在看 MSI,时隔三年,LPL 终于再一次拿到了 MSI 的冠军。小狗牛逼,RNG 牛逼,LPL 牛逼!
  • MSI 决赛的第三局 Letme 的一手剑来,让我又想再把 《雪中悍刀行》再看一遍了
  • 据说隔壁 Dota 2 项目也得了冠军,西恩军团牛逼!
  • 为了庆祝 RNG MSI 夺冠,昨天请好朋友一起吃了日本料理,Excited !