1
/
5

チームでサーバ接続設定を共有した話

こんにちは、Libryでテックリードをやっている中村です

Libryではチームの開発効率を高めるために日々様々な取組をしています

Docker や GitOps なんかは良くブログとかでも注目を浴びて取り入れているチームも多いと思いますが、 今回は地味で枯れた技術だけれど重要なサーバ接続設定ssh_configを共有した話を取り上げたいと思います

対象読者

  • サービス・プロダクトを複数抱えている
  • サーバーにSSH接続する機会が間々ある
  • SSH接続設定が原因だったトラブルシューティングをしたことがある

ssh_config とは

ssh_configSSH接続をする際に指定するコマンドオプションを設定ファイル化して管理する仕組みです

設定は任意に名付けできる Host 毎にまとめられ、

ssh {Host値}

で接続できるようになります

また Host にはワイルドカードを含めて共通設定を切り出したり、 Include を利用して設定項目を Host 値に縛られずにモジュール化して共有できたりもします

ssh_config の構成図

Libry では下記の構成で設定値をGit管理して共有しています


設定ファイル展開

~/.sshをGitリポジトリにするという大胆な手は取らずに、~/.sshconfigconf.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年以上経ちますが、今のところ問題は発生していないので是非使ってみてください

以上、サーバ接続設定の共有話でした

株式会社Libryでは一緒に働く仲間を募集しています
2 いいね!
2 いいね!

今週のランキング

中村 文明さんにいいねを伝えよう
中村 文明さんや会社があなたに興味を持つかも