読者です 読者をやめる 読者になる 読者になる

SideCI TechBlog

SideCIを作っているアクトキャットのエンジニアによる技術ブログです。


MItamaeを開発環境構築に使ってみた話

こんにちは。最近何も考えたくないときはアニメ「ゆゆ式」を観ている笠井です。 前回のブログを書いたえりいさんも笠井姓ですが、特に親戚というわけではありません。10人前後の会社で笠井姓が2人いるってどんな確率なんだろうかなどと考えています。

今回は、構成管理ツールの「MItamae」を使って開発環境を作ってみました。なお、環境は macOS Sierra です。

MItamae とは

github.com

MItamae は @k0kubun さんが開発した、mruby-cli を利用した pure mruby 実装の構成管理ツールです。 元々は itamae-mruby という名前でした。 読み方は「見給え」ではなく「えむ・いたまえ」です。

元々 Itamae という Ruby DSL で書ける構成管理ツールがありますが、MItamae と Itamae の大きな違いは、 Ruby や gem に依存しないことです。これまで Itamae を使ってプロビジョニングしようとした場合、レシピを実行するには Ruby であったり itamae gem が必要でした。そのため、Ruby の入っていない環境でプロビジョニングしようとした場合、Ruby をインストールするか外部からプロビジョニングする対象にSSHして Itamae を実行する必要がありました。そのためだけに Ruby を入れるのはめんどくさいです。

一方、MItamae はシングルバイナリをダウンロードするだけで実行できます。また、コンパイル済みなので起動が高速です。 curl なり wget なりでもってきたら、そのまま実行できると思います。

詳しくは k0kubun さんのブログがわかりやすいのではと思います。

MItamae レシピ

ディレクトリ構成

はじめに私の作った dotfiles も一応置いておきます。だいたいの構成等は k0kubun さんの dotfiles にかなり倣っています。

github.com

ざっくりとした構成は以下のようになっていて、Itamae ベストプラクティスに準拠しています。

% tree -aL 2
.
├── .gitignore
├── .gitmodules
├── README.md
├── bin
│   └── setup_mitamae
├── bootstrap.rb
├── config
│   ├── .bash_profile
│   ├── .gitconfig
│   ├── .tmux.conf
│   ├── .vim
│   ├── .vimperatorrc
│   ├── .vimrc
│   ├── .zplug
│   ├── .zshrc
│   ├── bin
│   ├── peco
│   └── zshrc
├── cookbooks
│   ├── .keep
│   ├── git
│   ├── ruby
│   ├── symboliclinks
│   ├── vim
│   └── zsh
├── install.sh
├── plugins
│   └── itamae-plugin-recipe-rbenv
└── roles
    ├── .keep
    ├── darwin
    └── linux

全体の流れは、install.sh を全体の起点にしていて、これが setup_mitamae を呼び、 MItamae のバイナリをダウンロードしたあと、 bootstrap.rb を実行して、OS に合わせて role 及び cookbook を実行します。

レシピづくりは itamae のベストプラクティスに乗っかるので、itamae コマンドを使うために、 itamae をインストールして作っていくのが早いと思います。実行時は Ruby はなくてもいいけど、レシピ作りには必要です。

% gem install itamae
% mv dotfiles old-dotfiles

などとして、既存のdotfilesをリネームして逃しておきます。あとから逃した old-dotfiles 内の各ファイルを dotfiles に再度移植します。

いろいろな cookbook

この cookbook において、一番重要であろうレシピはおそらくシンボリックリンクを張れるようにするレシピだと思います。これを最初に実行する cookbook にしています。

define :ln do
  dotfile = File.join(ENV['HOME'], params[:name])
  link dotfile do
    to File.expand_path("../../../config/#{params[:name]}", __FILE__)
    not_if "test -e #{dotfile}"
  end
end

このようなファイルを書いておくと、後続の Vim や Zsh の cookbook において、

ln '.vimrc'
ln '.zshrc'

などと書いておけば、レシピを流した時に勝手にシンボリックを張ってくれます。なお、私は NeoVim も使うことがあるのですが、NeoVim の設定ファイルである init.vim と .vimrc をシンボリックを張って共通化する部分は、上記の ln は使えないので、以下のようにして逃げています。

directory "#{ENV['HOME']}/.config/nvim" do
  action :create
  not_if "test -d #{ENV['HOME']}/.config/nvim"
end

# http://qiita.com/okamos/items/2259d5c770d51b88d75b
link "#{ENV['HOME']}/.config/nvim" do
  to "#{ENV['HOME']}/.vim"
  force true
end

link "#{ENV['HOME']}/.config/nvim/init.vim" do
  to "#{ENV['HOME']}/.vimrc"
  force true
end

MItamae は Itamae で使える resource のほとんどがそのまま流用できます。べんり。

また、私は普段 Ruby を使って仕事をすることが多いので、Ruby をインストールするための cookbook も作ります。Ruby のインストールでは自力で cookbook を書かず、既存の Itamae plugin を利用したいと思います。

github.com

通常 Itamae plugin は Gemfile に記述して導入するのですが、そもそも mruby である MItamae はそのような機構をもっていません。したがって、dotfiles ディレクトリの中に plugins ディレクトリを作成し、Git submodule を使うことで Itamae plugin を導入します。

% mkdir plugins && cd plugins
% git submodule git@github.com:k0kubun/itamae-plugin-recipe-rbenv.git

MItamae の plugin の扱いについてのドキュメントを置いておきます。

itamae-plugin-recipe-rbenv に関しては MItamae の場合における使い方が既にREADMEにあるので、それを利用してレシピを作りました。

node.reverse_merge!(
  rbenv: {
    user: 'akito',
    global: '2.3.1',
    versions: %w[
      2.3.2
      2.3.1
      2.3.0
    ],
  }
)

include_recipe "rbenv::user"

これで一旦レシピは完成なので、あとは新しい環境で起点用に作った install.sh を実行したらあとは MItamae が勝手にいろいろやってくれます。

既にシンボリックリンクとか張ったあとに実行したやつですが、実行すると以下のような形になります。

 % bin/mitamae-x86_64-darwin-0.6.0-invoke local bootstrap.rb
 INFO : Starting MItamae...
 INFO : Recipe: /Users/akito/dotfiles/bootstrap.rb
 INFO :   Recipe: /Users/akito/dotfiles/roles/darwin/default.rb
 INFO :     Recipe: /Users/akito/dotfiles/cookbooks/symboliclinks/default.rb
 INFO :     Recipe: /Users/akito/dotfiles/cookbooks/vim/default.rb
 INFO :       link[/Users/akito/.vim] to will change from '/Users/akito/dotfiles/config/.vim' to '/Users/akito/.config/nvim'
 INFO :     Recipe: /Users/akito/dotfiles/cookbooks/git/default.rb
 INFO :     Recipe: /Users/akito/dotfiles/cookbooks/zsh/default.rb
 INFO :     Recipe: /Users/akito/dotfiles/cookbooks/ruby/default.rb
 INFO :       Recipe: plugins/itamae-plugin-recipe-rbenv/mrblib/itamae/plugin/recipe/rbenv/user.rb
 INFO :         Recipe: plugins/itamae-plugin-recipe-rbenv/mrblib/itamae/plugin/recipe/rbenv/install.rb
 INFO :           Recipe: plugins/itamae-plugin-recipe-rbenv/mrblib/itamae/plugin/recipe/rbenv/dependency.rb

さいごに

MItamae は、 Roppongi.rb で k0kubun さんが MItamaeの発表をしていて、そこで知りました。ほとんど Itamae そのままに書けるので、個人的にそこまで戸惑うことなく導入できました。

しかし、私の途中のやり方がまずかったのか、途中、MItamae のシンボリックリンクを張るところでそれが壊れてしまっている(なので上の例では bin/mitamae-x86_64-darwin-0.6.0-invoke みたいな長い名前でバイナリ実行してる)ので、締切が近い卒論を片付けたら直そうと思います。。

NeoVim もシンボリックリンクを張るだけじゃなくてインストールしてビルドするあたりまで書きたいし、ほかにもいくつかやりたいことがあるので、そのへんも追い追いやりたいと思っています。

Itamae は Wiki が充実しているので、書き方に困ったら、そのWikiItamae チートシートとかみるとべんりです。