サーバーのプロビジョニングをmitamae + hochoでやる方法

## mitamaeとは
https://github.com/itamae-kitchen/mitamae

Chefに比べ、よりシンプルかつ依存(chef server, cookbook, berkshelf, data_bags)が少なく実行できる[Itamae](https://github.com/itamae-kitchen/itamae)というツールがあるんですが、[mitamae](https://github.com/itamae-kitchen/mitamae)はmrubyを使うことでそこから更に依存(Rubyインタプリタ, RubyGems)を減らしシンプルにしたツールです。

歴史:
https://k0kubun.hatenablog.com/entry/itamae-mruby
https://k0kubun.hatenablog.com/entry/mitamae

### 何故mitamaeは便利なのか
`itamae ssh`を使うとサーバーに何も入ってない状態のまま気軽にサーバーをプロビジョニングできるため非常に便利なのですが、`itamae ssh` は各コマンドごとにssh越しの通信が発生してしまい非常に遅く不快なため、通の間ではomnibus-itamaeなどでRuby処理系やitamae.gemごとItamaeをサーバーにインストールし`itamae local`を実行するのがベストプラクティスとなっています。

結局サーバーに持っていくならシングルバイナリであるmitamaeを使うほうがクリーンで問題が起きにくいですし、またmitamaeは最初から`itamae ssh`をサポートしないつもりでコマンド実行のかわりに直接Cの関数呼び出しが行われるような実装も入っているため、一般に`itamae local`より実行が高速です。

## hochoとは
https://github.com/sorah/hocho

Itamaeメンテナの一人であるsorahさんが作った、Itamaeとmitamaeを実行するためのツールです。手元でこのgemをインストールし、設定ファイルのYAMLを書いて`hocho apply` を実行すると、レシピをサーバーにrsyncしてmitamaeバイナリをダウンロードして実行、といったことが簡単に行なえます。

台数の少ない用途でmitamaeを実行する場合、sshとrsyncだけで手軽にレシピが実行できるhochoを使うと便利です。

## 使い方
何か適当に空のディレクトリを用意して移動しておいてください。

### 1. hocho gemをインストールする

```ruby:Gemfile
source 'https://rubygems.org'

gem 'hocho'
```

`bundle install` しておきます。

### 2. hosts.yml を用意する

あらかじめ .ssh/config をいじって `ssh foo-bar` できるようにしておいてください。その後、カレントディレクトリに以下のような hosts.yml を書きます

```yaml:hosts.yml
foo-bar:
  properties:
    run_list:
      - default.rb
```

最新の情報は https://github.com/sorah/hocho#setup を参照してください

### 3. レシピを用意する
`run_list` を指定したので、その名前 (今回は default.rb) でレシピを書いておきます。

```ruby:default.rb
execute 'echo hello world'
```

### 4. hocho.yml を用意する
最後に、hocho.ymlを用意すれば準備完了です。多分最初は一番面倒なパートですが(Linux x86_64の場合は)コピペで動くと思います。

```
property_providers:
  - add_default:
      properties:
        preferred_driver: mitamae

driver_options:
  mitamae:
    mitamae_path: /usr/local/bin/mitamae
    mitamae_options: ['--log-level', 'info']
    mitamae_prepare_script: |
      wget -O /usr/local/bin/mitamae https://github.com/itamae-kitchen/mitamae/releases/download/v1.6.2/mitamae-x86_64-linux &&
      echo "047cc776f2b0b555c7a6d90c32c7c581529bfc1a5db48ddb3090ee79d55ce3f3  /usr/local/bin/mitamae" | shasum -a 256 -c &&
      chmod +x /usr/local/bin/mitamae
```

裏技として、ヘルパー的なレシピを`mitamae_options`の先頭に書いたりできます。場合によっては`--log-level`はdebugにしておいた方が快適かもしれません。

最新の情報は https://github.com/sorah/hocho#setup を参照してください

### 5. 実行
sudo passwordを入力するのがダルい時は`$SUDO_PASSWORD`が何らかの形で渡るようにしておくと楽です

```
$ read -s SUDO_PASSWORD; export SUDO_PASSWORD

$ bundle exec hocho apply --dry-run foo-bar
Running using mitamae
=> $ rsync -az --copy-links --copy-unsafe-links --delete --exclude\=.git --rsh ssh\ -o\ \"PubkeyAuthentication\=yes\"\ -o\ \"PasswordAuthentication\=yes\"\ -o\ \"PreferredAuthentications\=none,publickey,password,keyboard-interactive\"\ -o\ \"User\=k0kubun\"\ -o\ \"Port\=xxxx\"\ -o\ \"HostName\=xxx.xx.xxx.xxx\"\ -o\ \"IdentityFile\=\~/.ssh/xxx\" . xxx.xx.xxx.xx:/tmp/hocho-run-LRmQto5bS/itamae
$ test -x /usr/local/bin/mitamae
$ umask 0077 && cat > /tmp/hocho-run-LRmQto5bS/node.json
$ chmod 0700 /dev/shm/hocho-run-3AMga3Ydr/tmp.WVJHiETiDB; cat > /dev/shm/hocho-run-3AMga3Ydr/tmp.WVJHiETiDB; chmod +x /dev/shm/hocho-run-3AMga3Ydr/tmp.WVJHiETiDB
=> kubernetes-master # /usr/local/bin/mitamae local -j /tmp/hocho-run-LRmQto5bS/node.json --log-level info --dry-run default.rb
$ bash
[foo-bar]   INFO : Starting MItamae...
[foo-bar]   INFO : Recipe: /tmp/hocho-run-LRmQto5bS/itamae/default.rb
[foo-bar]   INFO :   execute[echo hello world] executed will change from 'false' to 'true'
$ shred --remove /dev/shm/hocho-run-3AMga3Ydr/tmp.WVJHiETiDB
=> kubernetes-master $ rm -rf /tmp/hocho-run-LRmQto5bS/itamae
$ rm -rf /tmp/hocho-run-LRmQto5bS/itamae
```

本番は `--dry-run` を外してください。

以上で、快適にmitamaeが実行できるようになったかと思います。レシピの書き方は https://github.com/itamae-kitchen/itamae/wiki とかを参考にしてください。