こんにちは、Libryでテックリードをやっている中村です
Libryではチームの開発効率を高めるために日々様々な取組をしています
Docker や GitOps なんかは良くブログとかでも注目を浴びて取り入れているチームも多いと思いますが、 今回は地味で枯れた技術だけれど重要なサーバ接続設定ssh_config
を共有した話を取り上げたいと思います
対象読者
- サービス・プロダクトを複数抱えている
- サーバーにSSH接続する機会が間々ある
- SSH接続設定が原因だったトラブルシューティングをしたことがある
ssh_config とは
ssh_config はSSH接続をする際に指定するコマンドオプションを設定ファイル化して管理する仕組みです
設定は任意に名付けできる Host 毎にまとめられ、
ssh {Host値}
で接続できるようになります
また Host にはワイルドカードを含めて共通設定を切り出したり、 Include を利用して設定項目を Host 値に縛られずにモジュール化して共有できたりもします
ssh_config の構成図
Libry では下記の構成で設定値をGit管理して共有しています
設定ファイル展開
~/.ssh
をGitリポジトリにするという大胆な手は取らずに、~/.ssh
へ config
とconf.d
を注入する方式を採用しました
#!/bin/sh
cd `dirname $0`
# ~/.ssh/conf.d ディレクトリ作成
if [ ! -d ~/.ssh/conf.d ]; then
mkdir -p ~/.ssh/conf.d
chmod 700 ~/.ssh ~/.ssh/conf.d
echo '~/.ssh/conf.d ディレクトリを作成しました'
fi
cp .ssh/config ~/.ssh/config
echo '.ssh/config を ~/.ssh/config に配置しました'
# ~/.ssh/conf.d/* を上書き
for path in .ssh/conf.d/*; do
if [ `find $path -name '*config' | wc -l` = 0 ]; then
if [ -d ~/$path ]; then
rm -fR ~/$path
echo "$path を削除しました"
fi
else
rm -fR ~/$path
cp -a $path ~/$path
echo "$path を ~/$path に配置しました"
fi
done
~/.ssh/conf.d
全置換だと後述の ~/.ssh/conf.d/private
とか扱えなくなるので for ループで conf.d を置換しています
例のlibry-inc
,hoge-inc
あたりを消したい時は .gitkeep だけ入れた空ディレクトリを配置することで削除を実現できるようにしています
エントリーポイント
Include のみで構成します
.ssh/config
Include conf.d/private/preload_config
Include conf.d/common/preload_config
Include conf.d/*/config
Include conf.d/private/postload_config
Include conf.d/common/postload_config
Include は対象ファイル・ディレクトリが無くてもエラーなく動くので、わかり易さ重視で最終的に使わないにしてもとりあえず記述しています
~/.ssh/conf.d/private
はgit管理せずに各人が自由に設定を記述できるようにしています
共通項目設定
設定が重複した場合は先に読み込まれた値が優先されるので上書きされても良い共通項目postload_config
に記述します
下記一例です
.ssh/conf.d/common/postload_config
Host *
AddKeysToAgent yes
ForwardAgent yes
IdentityFile ~/.ssh/id_rsa
ServerAliveCountMax 5
ServerAliveInterval 30
UseKeychain yes
非共通項目設定
あとは.ssh/conf.d/*/config
を好きなように記述していきます*
の部分は.
から始まる隠しフォルダで無ければ何でも良く、自社管理分とパートナー企業管理分みたいに分けたり、サービス毎に分けたり、設定数に応じて適宜細分化すると良いです
Libryの場合は.ssh/conf.d/libry-inc/config
から更に Include 多用して複数ファイルに分けて整理していたりします
また、個人端末で利用している時や、まだコミットするまでも無い実験用サーバにアクセスするための設定は~/.ssh/conf.d/private/config
(ssh_config repository の外) に直接記述します
~/.ssh/id_rsa
以外のファイルを IdentityFile として使っている場合なんかはconf.d/private/preload_config
に記述して対処できたりします
最後に
これをチームで共有すればサーバ接続設定関連のトラブルシューティングは、最新の ssh_config をプル&デプロイするかPR出して修正かけるかのどちらかで解決できるようになります
Libry ではこの ssh_config の運用が2年以上経ちますが、今のところ問題は発生していないので是非使ってみてください
以上、サーバ接続設定の共有話でした