プロビジョニングツール "itamae" を導入した話


この記事は [Relux AdventCalendar](https://qiita.com/advent-calendar/2017/relux) 7日目の記事です。

 
# プロビジョニングツール "itamae" を導入した話

Reluxに業務委託で協力している @futoase です。
プロビジョニングツールとして[itamae](http://itamae.kitchen/)を導入しました。

# itamaeの特徴

主に、以下の点が取り上げられます。

- Ruby製
- Chefに近い記法で書ける
- プロビジョニングの実行順序が記述順
- Plugin機構があり、機能拡張が可能

# 導入時のプロビジョニングファイル構成

ファイル構成として以下のようになりました。
(一部のファイルは簡略のため省略しています)

```shell-session
.                                                                                                                         
├── Gemfile                                                                                                               
├── Gemfile.lock                                                                                                          
├── README.md                                                                                                             
├── Vagrantfile                                                                                                           
├── cookbooks                                                                                                             
│   ├── apache                                                                                                            
│   │   ├── default.rb                                                                                                    
│   │   └── templates                                                                                                     
│   │       └── etc                                                                                                       
│   │           └── httpd                                                                                                 
│   │               ├── conf.d                                                                                            
│   │               │   └── virtual.conf.erb                                                                              
│   │               └── httpd.conf.erb                                                                                    
│   ├── common                                                                                                            
│   │   ├── disable_services.rb                                                                                           
│   │   └── timezone.rb                                                                                                   
│   ├── composer                                                                                                          
│   │   └── default.rb                                                                                                    
│   ├── elasticsearch                                                                                                     
│   │   ├── default.rb                                                                                                    
│   │   └── templates                                                                                                     
│   │       └── etc                                                                                                       
│   │           └── yum.repos.d                                                                                           
│   │               └── elasticsearch.repo                                                                                
│   ├── git                                                                                                               
│   │   └── default.rb  
├── nodes
│   ├── ec2-elasticsearch.json
│   ├── vagrant-aggregator.json
│   ├── vagrant-api.json
│   ├── vagrant-elasticsearch.json
│   └── vagrant-web.json
├── roles
│   ├── api.rb
│   ├── elasticsearch.rb
│   ├── fluentd_aggregator.rb
│   └── web.rb
└── secret
    └── values
        ├── aws_access_key_id
        └── aws_secret_access_key
```

## 各ディレクトリについて

- cookbooks
    - セットアップしたいソフトウェア/ミドルウェアのプロビジョニングファイル
        - defaults.rb
            - 基本はこちらにセットアップしたいミドルウェアのプロビジョニング構文を書く
        - templates
            - 設定ファイルの雛形を置き、プロビジョニング時に利用する
            - mysqlのセットアップファイルなど
- nodes
    - セットアップ対象のサーバ情報を管理する
        - IPアドレス
        - ホスト名
        - セットアップに利用する一時変数
- roles
    - セットアップしたいミドルウェア/ソフトウェアのcookbooksを目的別に管理する
        - 中身は、cookbooks以下のdefault.rbファイルをrequireしている
- secret
    - [itamae-secrets](https://github.com/sorah/itamae-secrets)用
    - 例では、awsのキー/シークレットキーのペアを管理

# プロビジョニングの実行

*プロビジョニングを実行するホストと、プロビジョニング対象がネットワークで疎通できている環境が構築できていることが前提です。

itamaeコマンドを実行することでプロビジョニングが開始されます。

```
> bundle ex itamae \
ssh -i ~/.ssh/secret.pem \
--user ec2-user \
--node-json nodes/ec2-elasticsearch.json \
--host 10.0.0.0 \
roles/fluentd_aggregator.rb
```

上記のコマンドの場合、

- sshの秘密鍵を ~/.ssh/secret.pem を利用する
- userはec2-userでsshログインを実行する
- ホスト用のnodeファイルは nodes/ec2-elasticsearch.json を利用する
- hostは10.0.0.0を利用する
- roles/fluentd_aggregator.rbを利用する

となります。このコマンドを実行することで、プロビジョニングが実行されるようになります。

# 開発環境に対するプロビジョニング

上記までは、実際のホスト上に対してプロビジョニングを行う設定になっています。
Vagrantと連携することで、開発環境として利用しているVagrant(Virtualbox)に対してプロビジョニングを実行することができるようになります。

## 実行に必要なVagrant Plugin

- [vagrant-itamae](https://github.com/chiastolite/vagrant-itamae)
    - itamaeをVagrantで利用するためのplugin
- [vagrant-multiplug](https://github.com/r7kamura/vagrant-multiplug)
    - itamae用のPluginをVagrantで利用するためのplugin

以上のPluginを使って、Vagrantfileを編集します

```ruby
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.plugin.add_dependency "itamae-secrets"
  config.vm.define "web" do |web|
    web.vm.provider "virtualbox" do |vb|
       vb.gui = false
       vb.memory = "1024"
       vb.customize ["modifyvm", :id, "--natdnsproxy1", "off"]
       vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off"]
    end

    web.vm.provision "itamae" do |config|
      config.sudo = true
      config.recipes = ['./roles/web.rb']
      config.json = './nodes/vagrant-web.json'
    end
  end
end
```

このように書くことで、itamaeを利用したプロビジョニングが可能になります。

```
> vagrant up web
> vagrant provision web
```

# itamaeを導入して

itamae以外にもansibleやchefがあります。
導入時に、受け入れ側のチームの規模(ナレッジ共有が規模が大きくなれば難しくなっていく)や採用するツールのメンテナンス状態を考慮を行う必要があります。

itamae -> ansibleの直接的な変換は難しいのですが、概念としては
プロビジョニングツールとして似通う点が多いため(nodeの扱い、roleの扱い)、
移行するとしても問題は無いでしょう。

導入時のチーム規模とランニングコストを天秤にかけ、itamaeを採用しました。
結果、プロビジョニングに実際に利用できるようになり、開発環境構築にも利用できるようになりました。

shell scriptや手作業での運用をしている現場で、試しに導入していただいたらいかがでしょうかm(_ _)m