生成iTerm2 Dynamic Profile

587 阅读2分钟

日常服务器运维中,很多情况下,我们得登录到远程,当服务器一旦多了之后,管理还是挺麻烦的。之前一直用的SSH Shell这个小工具,一直用的挺顺畅,直到看到它在不断接收文本太多之后一次又一次奔溃,终于打算放弃。

后来仔细回想,似乎iTerm 2的Profile的就能达到类似的效果:

  1. 新建Profile,在"Send text at start"中输入"ssh host",保存;
  2. CMD + O,选择host,确定,就可以直接连到服务器上面;

只是,那么多的profile要我手工录入无异于侮辱我是个工程师的身份。

赶紧问谷老哥,恩,『自从iTerm2版本2.9.20140923之后,增加了个Dynamic Profile的功能』,简单来说,你需要根据特定的格式,xml或者json,提供一个配置文件,然后iTerm2会直接自动加载。只是!!!需要你来生成这个配置文件,恩,二话不说,毕竟在装逼的路上,咱得不点鼠标,少敲键盘

本来想着,干脆开脚本做个工具,但是!!!我是懒人好不,写个脚本费事不,有现成工具不用作甚!

⚠️ 接下来继续的话需要以下几个基础知识:

  • ansible (常用运维工具)
  • js-beautify (Node.js格式化代码工具)

首先,根据提示,为了制作这个profile.json(输出),我们需要根据先用的host列表来生成(输入)。很自然的想到,目前是根据inventory来管理hosts列表的,那么,我们是不是可以根据这个来直接生成呢?

对的,用ansible的template module:

# profile.j2
{
  "Profiles": [
{% for group in groups %}
  {% if group != 'all' %}
  {% for host in groups[group] %}
    {
      "Name" : "{{host}}",
      "Guid" : "{{group}}-{{host}}",
      "Initial Text" : "ssh {{host}} tmux a",
      "Tags": ["{{group}}"]
    },
  {% endfor %}
  {% endif %}
{% endfor %}
  ]
}

然后一条命令搞定:

ansible localhost -m template -a "src=./profile.j2 dest=./profile.json" --connection=local

接下来作为强迫症的我,必须要format一下:

js-beautify -r -s 2 ./profile.json

会有个小问题,因为上面的模板中,最后个元素后面还有逗号,严格来说是不允许的,但是iTerm2不介意,所以不用管。

然后移到目录即可:

mv ./profile.json /Users/x/Library/Application\ Support/iTerm2/DynamicProfiles/

现在,CMD + O,直接输入host名称,按确定,立马连上,那叫一个爽~
另外,不妨看看iTerm2上面的Profiles选项,你会看到,上面的组织方式,完全是按照你在inventory上面的分组一致,恩,不谢~