概要
AnsibleでMacの開発環境構築を自動化してみたので、やった事や調べたものをメモしておく。
Boxenみたいなのをansibleでやりたいなぁと思ったのがきっかけ。なのでour-boxen(テンプレ)みたいなのと、それをコピーしてカスタマイズした自分専用のリポジトリの二つを用意した。
- https://github.com/tell-k/blister-pack .... 基本的なセットアップ内容
- https://github.com/tell-k/blister-pack-mine ... 自分個人のセットアップ内容
blister-packの利用方法はREADME.rstを参照してください。
以下のような事をやった。
- Mac OSX の開発環境構築をansibleで自動化する。主にhombrew + homebrew-caskで必要なパッケージをインストール
- Boxenのように、共通部分、個人、プロジェクトに分けて構築内容(role)を管理する。
- Serverspecでテストする。
- Travis CIでビルド/テストを実行する
Ansibleで環境構築
- 主にansibleのhombrewモジュールとhombrew-caskモジュールで大概のものはインストールできた。
- ansibleのローカル環境への実行はinventryファイルに以下のように書けば良い。
[localhost]
127.0.0.1
[localhost:vars]
ansible_connection=local
Roleの管理
- Boxenのように共通分/個人/プロジェクト毎に、構築内容を分けて管理するようにした。
├── Makefile
├── README.rst
├── Rakefile
├── callback_plugins
├── hosts
├── playbook.yml
├── roles
│ ├── common # <- 共通で使うrole群
│ ├── people # <- 個人毎のrole群
│ └── projects # <- プロジェクト毎のrole群
└── spec
├── common
├── people
├── projects
└── spec_helper.rb
Serverspecでテスト
- ServerspecでAnsibleでの構築内容をテストできるようにした。
- envassertとansibleのassertモジュールを使うという選択肢もある。
- specファイルもcommon/people/projectsで分けるようにした。
- Serverspecはやりたい事が大概ドキュメントに書いてあるので便利
Travis CIでビルド/テスト
- Travis CI はビルド環境としてOS X環境を提供してくれる
- それを使ってビルド/テストをする
- OS Xを利用する場合は.travis.ymlで明示するだけ
- homebrew、xcodeなどは事前に入ってるらしい
- sudoはパスワード無しで実行できるらしいので、ansibleの「-K」オプションを抜かして実行している
language: objective-c
os:
- osx
before_install:
- brew update
- brew install python
- brew install ansible
- ansible-playbook -vv playbook.yml -i hosts
script:
- make test
TIPS
hombrewのupdate/upgrade
- homebrewのupdateはFormulaやhomebrew自身をアップデートする。
- upgradeは対象パッケージを再ビルド/インストールする。
- ansibleのhomebrewモジュールには「update_homebrew」「upgrade_all」というオプションがある。
- このオプションを適宜変更できるようにinventoryに変数をもたせた。
[localhost]
127.0.0.1
[localhost:vars]
homebrew_update=yes # 常にupdateするためyes。遅いと感じるならnoにする
homebrew_upgrade_all=no # 全パッケージの更新が必要になったらyesにする
homebrewモジュールにそのままパスしてる
- name: Update homebrew
homebrew: update_homebrew={{ homebrew_update }} upgrade_all={{ homebrew_upgrade_all }}
環境変数やパスの参照
- homebrewなどは「hombrew --prefix」「homebrew --cellar」などでパスを取得できる
- これをansibleやserverspecにどうやって渡すか。
- Ansibleの場合 lookup プラグインで、環境変数や、シェルの実行結果などを、参照できる。
- それを利用してinventoryファイルに定義すると、playbookの中で参照可能
[localhost]
127.0.0.1
[localhost:vars]
home_path={{ lookup('env','HOME') }}
homebrew_prefix={{ lookup('pipe','echo `brew --prefix`') }}
homebrew_cellar={{ lookup('pipe','echo `brew --cellar`') }}
これをroleの中で下記のように利用する
- name: Copy dnsmaq.conf
copy: src=roles/common/dnsmasq/files/dnsmasq.conf dest="{{ homebrew_prefix }}/etc/dnsmasq.conf" backup=yes
Serverspecの場合は何も考えずに、spec_helper.rbに定義した。
require 'serverspec'
set :backend, :exec
def home_path
home_path = `echo ~/`
home_path.chomp
end
def homebrew_prefix
prefix = `brew --prefix`
prefix.chomp
end
def homebrew_cellar
cellar_path = `brew --cellar`
cellar_path.chomp
end
AnsibleのCallbacksプラグインによる完了通知
- Ansibleを実行すると時間がかかるので、終わったら通知するようにした。
- AnsibleのCallbacksプラグインを使って、OS Xの通知センターに表示されるようにした。
- スクリプトはここ
Travisのビルド時間制限の対応
Travisは以下のような条件でビルドが強制的に終了してしまう。
- 50分以上ビルドにかかると強制終了される
- 一定時間標準出力がなくても強制終了される。
- http://docs.travis-ci.com/user/build-configuration/#Job-Timeouts
とりあえずインストールに時間がかかるものは、Travisではスキップするようにした。
- 本末転倒感がすごいのでより良い方法を探す。
lint的なチェック
- Ansibleは標準で--syntax-checkをしてくれるオプションがある
- ansible-lintというライブラリもある。-> tarvisでエラーが出た+大したチェックをしてくれないので今は使用してない
- serverspecの方は、rubocopを利用している。「--auto-correct」オプションである程度、自動で整形してくれるの良い。
- Makefileにcheckstyleと定義してチェックできるようにした
プライベートな構築内容の管理
- 例えばプライベートなプロジェクトのrole/spec群はそれぞれ「private」というディレクトリ以下において、gitignore設定している。
- プライベート用のYAML(private.yml)を用意して、毎回ansible実行時に、playbook.ymlとprivate.ymlをマージしてる。
githubのリポジトリの取り扱い
- Travis CI上でansibleのgitモジュールを使ってSSH経由でgithubのリポジトリをcloneするためには秘密鍵が必要
- その場合、デプロイキーを各リポジトリに設置するか、もしくはHTTPSでcloneするようにする必要がある。面倒なのでだいたいHTTPSにしている。
例: gitモジュールのrepoをhttpsで始まるURLにしている。
- name: Git clone tell-k/sphinxjp.themes.basicstrap
git: repo=https://github.com/tell-k/sphinxjp.themes.basicstrap.git dest=~/Work/python/sphinxjp.themes.basicstrap update=no
余談
- Travis CI以外は半年くらい同じ構成で試したけど、大きな問題は特になかった。Ansible素晴らしい。
- Serverspec + Travisでのチェックが割と安心感ある。Serverspecでテスト書くのはなんか楽しい。
- ライセンスの関係でApp Store経由で購入しているものもあるので、完全自動化は難しそう。
- 個人/プロジェクト毎みたいな話を書いたけど、ボッチなので自分以外の他に人と共有したり、使ってもらったりした事はない。
- blister-packていう珍妙な名はBoxenのTOP絵を見てつけた。
代替
Ansibleを利用してMac OS Xの環境構築をするアイディア/ツールは他にもいくつかある。
当初はこれらのツールを利用しようとしたが以下のような理由でやめた。
- Ansible以外のツール固有の何かを覚えるのが面倒そうだった。
- Boxenのようにラッパーコマンドがあったりするが、Ansibleのプラグイン機構で代用が効きそうだった。
- 単純にショートカットとしてのラッパーだったら、Makefileで十分だった。
参考
書籍
- 入門Ansible ... Ansibleで何ができるのかよく分かる本
- Pythonプロフェッショナルプログラミング第2版 ... Ansibleの章があります(ステマ)
- Pythonエンジニア養成読本 ... 入門Ansibleの中の人がAnsibleについて書いてるので、買って読む予定。
- Serverspec ... まだ買ってないので買わなあかん > 俺
Ansible関連
- All Modules — Ansible Documentation
- Mac の開発環境構築を自動化する (2015 年初旬編)
- geerlingguy/mac-dev-playbook
- ansibleコトハジメ
- ansible虎の巻
- 構成管理ツール Ansibleについて
- Ansible入門...?という発表をしました
- ansibleのログをfluentdに流す
- Ansible 1.5 リリース
- Ansibleのroleを使いこなす
- Ansibleで自作モジュールを作成してplaybookと一緒に配布
- Ansible チュートリアル
- Ansibleをローカルで使ってみた
Boxen関連
- Boxen使わなくても許されるのは2012年までだよね
- Boxenを実行すると何が起こるのか
- boxenでの構築でハマった所メモ
- boxenを導入した話
- Boxenを利用したMacのセットアップ
- もうすぐ 2014 年だけど boxen を独りで使ってみる
- Boxenを利用したMacのセットアップ
Homebrew-cask関連
- BoxenやめてBrewfile+homebrew-caskにした
- brew cask でインスコできるリスト
- Mac OSX をクリーンインストールしてからの環境構築メモ
- homebrew-cask でインストールしたアプリを Alfred から呼び出せない
- MacBook にインストールしているアプリやツールをメモする代わりに Brewfile を作った
- Homebrew vs Boxen を比較して、brewproj に着手
- Boxenとbrew Bundle && Homebrew-caskを比較した感想