Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

この記事は Relux AdventCalendar 7日目の記事です。

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

Reluxに業務委託で協力している @futoase です。
プロビジョニングツールとしてitamaeを導入しました。

itamaeの特徴

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

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

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

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

.                                                                                                                         
├── 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
    • 例では、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

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

# -*- 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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした