Posted at

プロジェクト毎に複数サーバある場合のssh configの管理方法


対象


  • 複数プロジェクトあったりしてssh configが膨大になってる人


  • Includeキーワードが使える2016-08-01リリースのOpenSSH 7.3以上を利用している人

  • ssh設定の一つ一つの項目自体は理解している人(本記事で説明を省きます)


ディレクトリ構造

まずはディレクトリ構造を記載します。

プロジェクトによっては踏み台サーバを経由する場合があったり、鍵環境毎で分かれてなかったりするので適宜置き換えてください。

本内容はあくまで一例ということで。


tree

~/.ssh

├ conf.d                  --- プロジェクト毎のディレクトリを入れるためのディレクトリ
│   ├ project1 --- プロジェクト1つ目のディレクトリ。プロジェクト名を仮にproject1とする
│   │   ├ config            --- project1で使用するssh設定をここに記載する(内容を後述)
│   │   ├ project1-prod.pem --- project1の本番サーバで使う秘密鍵
│   │   └ project1-dev.pem --- project1のの開発サーバ使う秘密鍵
│   └ project_2         --- プロジェクト2つ目のディレクトリ。プロジェクト名を仮にproject2とする
│   └ config          --- project2で使用するssh設定をここに記載する(project1のconfigと同じなので説明省略)
├ config          --- 全体に適用するssh設定をここに記載する(内容を後述)
├ id_rsa          --- config内でキーを指定してない場合にデフォルトで使われる秘密鍵
└ id_rsa.pub          --- 上記id_rsaの公開鍵


説明

ファイル内容を具体例を書きながら説明します。


~/.ssh/config

# 以下のIncludeで各プロジェクトのconfigが全てIncludeされる

Include ~/.ssh/conf.d/*/config

# *を指定してすべてのssh設定で適用したい項目を入れる
Host *
UseKeychain yes
StrictHostKeyChecking no
AddKeysToAgent yes
ForwardAgent yes
ServerAliveInterval 60
ServerAliveCountMax 60
TCPKeepAlive yes
IdentitiesOnly yes


大元の全体に適用されるssh設定と各プロジェクトのconfigのincludeを行います。


~/.ssh/project1/config

# project1に関わるサーバの情報はここにすべて記載する。

# 以下のような命名規則にする。
# Host <環境名>_<プロジェクト名>_<サーバ固有名>

Host dev_project1_api
HostName api.dev.project1.com

Host dev_project1_admin
HostName admin.dev.project1.com

Host prod_project1_admin
HostName admin.project1.com

Host prod_project1_api1
HostName api1.project1.com

Host prod_project1_api2
HostName api2.project1.com

Host prod_project1_api3
HostName api2.project1.com

# project1の開発環境で共通して使う設定項目を記載
Host dev_project1_*
IdentityFile ~/.ssh/conf.d/project_1/project1-dev.pem

# project1の本番環境で共通して使う設定項目を記載
Host prod_project1_*
IdentityFile ~/.ssh/conf.d/project_1/project1-prod.pem

# project1で共通して使う設定項目を記載
Host *_project1_*
User amasok
Port 2222


上記は管理サーバとAPIサーバがあり、開発環境と本番環境で鍵が分かれているパターンで記載しています。

もし鍵が本番と開発で同じであった場合は*_project1_*IdentityFileを記載します。

プロジェクト毎の規則によって変わるかと思いますが、だいたいこんな感じで僕は対応しています。