Itamae | recipe plugin で 板前によるトイレ設置をプラグイン化する #devops #itamae

# Itamae | recipe plugin で 板前によるトイレ設置をプラグイン化する #devops #itamae

## 概要
プロビジョニングツール Itamae

recipe plugin で 板前によるトイレ設置をプラグイン化します。
※toilet コマンドのインストールをプラグイン化します。

※toilet コマンドについては下記リンク参照
http://www.tecmint.com/20-funny-commands-of-linux-or-linux-is-fun-in-terminal/

## recipe plugin
公式 Wiki による Recipe Plugins の説明
https://github.com/itamae-kitchen/itamae/wiki/Recipe-Plugins

### Itamae の recipe は gem で管理
Itamae では recipe の管理は gem で行います。
Chef の Cookbook + Berkshelf の構成にあたります。

Ruby の一般的なライブラリの管理と同じ方法で行うことができるため手軽です。

### 命名規則
Itamae の recipe plugin を作成する場合、 gem 名は

***itamae-plugin-recipe-somename***

のフォーマットにする必要があります。
例えば、 tree をインストールするレシピなら

***itamae-plugin-recipe-tree***

のようにします。
長く感じますが、実際に利用する際は

~~~
include_recipe 'tree'
~~~

だけで済みます。

### 命名規則の利便性
Chef の Cookbook の場合、命名ルールがまちまちで統一感がなかった、
という点を顧みての規約化なのかな？と類推しています。
その他の統一によるその他のメリットとして検索しやすい、という点があります

* RubyGems で 「itamae-plugin-recipe」で検索すれば recipe plugin を確認できる
    http://rubygems.org/search?utf8=%E2%9C%93&query=itamae-plugin-recipe

* GitHub で検索する場合も RubyGems の場合と同様のメリットがある
    https://github.com/search?utf8=%E2%9C%93&q=itamae-plugin-recipe

### 課題？
例えば apache のインストールを行う recipe plugin を作るなら

itamae-plugin-recipe-apache

が最もシンプルで、この名前が一番オフィシャルな recipe plugin になると思います
まともにメンテする気のないの人にこの名前をとられてしまうと痛いですね。

### 上記の点を加味した解決策？
rutan さんが下記のレシピを公開されています

* [itamae-plugin-recipe-rtn_rbenvつくった](http://torigoya.hatenadiary.jp/entry/itamae-rbenv)
    * https://github.com/rutan/itamae-plugin-recipe-rtn_rbenv
    * http://rubygems.org/gems/itamae-plugin-recipe-rtn_rbenv


rtn => rutan かな？
プリフィックスを付与することで重要な名前である itamae-plugin-recipe-rbenv をあえて利用しない、
ということでしょうか。

一般の人が recipe plugin を作成する際は rutan さんのように何かしらプリフィックスを
付与するようにしておいたほうがよさそうです。
個人レベルなら **GitHub のアカウント** 。組織内で利用するなら **組織名** などが良いかな？
社内利用の場合は、 private な GemServer などを利用すると思うのでプリフィックスをつけなくてもいいかもしれませんが。
このあたり、 Itamae を開発し、実運用しているクックパッドさんがどういった運用をされているか気になりますね。

プリフィックスなしの recipe plugin は official recipe plugin として、
ある程度品質に責任を持てるレベルの方たちが作成するなどルールがあったほうが良いのかな？

## 試行
### 仕様
* toilet をインストールするだけの recipe plugin を作成

### itamae-plugin-recipe-toilet

~~~bash
# bundle gem で gem のひな型を生成
$ bundle gem itamae-plugin-recipe-toilet
~~~

* itamae-plugin-recipe-upgrade/lib/itamae/plugin/recipe/toilet.rb を編集

~~~bash
package "toilet" do
  action :install
end
~~~

* その他のファイルの編集内容は省略（通常の gem 作成時と同じ）

### recipe plugin を install
今回は Private な Gemサーバーに公開し、そちらからインストールします。
gem server は geminabox を利用します。

詳しくはこちらの記事を参照。
[Ruby | RubyKaigi2014の知見。geminabox gem で Private な Gem Server を構築 #rubykaigi](http://qiita.com/tbpgr/items/53794bfb2a7c0d7247eb)

~~~bash
$ tree -L 2
.
┗ itamae-plugin-recipe-toilet
    ┣ Gemfile
    ┣ itamae-plugin-recipe-toilet.gemspec
    ┣ lib
    ┣ LICENSE.txt
    ┣ Rakefile
    ┗ README.md

# recipe を実装

$ cd itamae-plugin-recipe-toilet
$ rake build
# geminabox で作成したサーバーに gem を公開
$ gem inabox ./pkg/itamae-plugin-recipe-toilet-0.0.1.gem
~~~

![geminabox_toilet.png](https://qiita-image-store.s3.amazonaws.com/0/43480/33201f30-55a9-5b04-57ee-f678d825e7a7.png)

### レシピを作成

~~~ruby
include_recipe 'toilet'
~~~

### Gemfile を作成

~~~ruby
source 'http://your_gem_server:your_port/'

gem 'itamae'
gem 'itamae-plugin-recipe-toilet'
~~~

~~~bash
# geminabox（private gem server） から install
$ bundle install
$ gem list | grep itamae
itamae (1.0.1)
itamae-plugin-recipe-toilet (0.0.1)
~~~

### 実行

~~~
$ tree -L 1
.
┣ Gemfile
┣ Gemfile.lock
┣ itamae-ubuntu.rb
┗ Vagrantfile

$ sudo bundle exec itamae local recipe.rb
$ which toilet
/usr/bin/toilet
$ toilet -v
TOIlet Copyright 2006 Sam Hocevar
Internet: <sam@hocevar.net> Version: 0.2, date:

TOIlet, along with the various TOIlet fonts and documentation, may be
freely copied and distributed.

If you use TOIlet, please send an e-mail message to <sam@hocevar.net>.

The latest version of TOIlet is available from the web site,
        http://libcaca.zoy.org/toilet.html

Usage: toilet [ -hkostvSW ] [ -d fontdirectory ]
              [ -f fontfile ] [ -F filter ] [ -w outputwidth ]
              [ -I infocode ] [ -E format ] [ message ]

$ toilet "Itamae" -F gay

 mmmmm    m
   #    mm#mm   mmm   mmmmm   mmm    mmm
   #      #    "   #  # # #  "   #  #"  #
   #      #    m"""#  # # #  m"""#  #""""
 mm#mm    "mm  "mm"#  # # #  "mm"#  "#mm"
~~~

![itamae_toilet_gay.png](https://qiita-image-store.s3.amazonaws.com/0/43480/df6bba5e-c0ff-3b0f-a6e0-8cb8d0745112.png)

## 参照
* [Itamae GitHub](https://github.com/itamae-kitchen/itamae)
* [vagrant-itamae GitHub](https://github.com/chiastolite/vagrant-itamae)
* [軽量・高速版 Chef 「Itamae」。 プロビジョニングツールの学習コスト低下。Berkshelfからの解放。Chef Solo から Chef Zero への移行からの解放 #devops #itamae](http://qiita.com/tbpgr/items/3b6796c1cfc3c3e5521f)