対象
- 複数プロジェクトあったりして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
を記載します。
プロジェクト毎の規則によって変わるかと思いますが、だいたいこんな感じで僕は対応しています。