Itamaeでインフラを構築しているとします。 同じようなレシピをもつ複数のWebサービスを運営するとき、リポジトリはどのように管理すればよいでしょうか。 新しいサービスをつくる度にインフラ用のリポジトリをつくるのは避けたいところです。

この記事では、1つのリポジトリでいくつかのWebサービスのインフラを管理する方法についてまとめます。

はじめに

Itamaeの導入については事前に完了しているものとします。 まだの場合は、次の記事を参考に導入を行なっておいてください。

やりたいこと

今回紹介する内容は、次のようなことを満たすものとします。

  • レシピはWebサービス間で共有する
  • 個々のWebサービスに適用する(1)レシピの一覧、(2)変数、(3)機密情報はファイルを分けて管理する
  • 1つのリポジトリですべてを管理する

ディレクトリ構成

前述のやりたいことを実現するための構成として、ディレクトリはnodesrolessecret各ディレクトリにおいて、ホスト名で分割します。

こうすることで、共通のレシピを利用しつつ、適用するレシピの一覧をxxx.jsonで決めることができます。 また、レシピ内の変数をxxx.rbや暗号化情報で設定することができます。

$ tree .
.
├── cookbooks
│   ├── nginx
│   ├── ruby
│   └── ...
├── nodes
│   ├── foo.example.com
│   │   └── production.json
│   └── bar.example.com
│       ├── staging.json
│       └── production.json
├── roles
│   ├── foo.example.com
│   │   └── server.rb
│   └── bar.example.com
│       ├── web.rb
│       ├── app.rb
│       └── db.rb
└── secret
    ├── foo.example.com
    │   └── ...
    └── bar.example.com
        └── ...

ホストによってはステージング環境があったり、Webサーバやアプリケーションサーバ、DBサーバなどが分割されている場合もあると思います(上記のbar.example.com)。 こういったケースにも対応できる構成となっています。

適用方法

レシピの適用は、通常どおり次のようなコマンドで行ないます。 適用するホストや環境、サーバの役割に応じてパラメータを変えることで実行します。

$ itamae ssh -h [host] -u [user] -i [key] -j nodes/[host]/[environment].json roles/[host]/[role].rb

おわりに

Itamaeは思想がとてもシンプルなので、サーバの構成などに応じて自由に設計できて便利ですよね。

複数のWebサービスのインフラをまとめて管理したい場合は、この記事の内容が参考になれば嬉しいです。