MacBook Pro 2700/13.3 MF839J/A を購入したので (わーい) 、構成管理ツール ansible を使ってセットアップした。

t-wada さんのエントリ Mac の開発環境構築を自動化する (2015 年初旬編) – t-wadaのブログ変更する を見れば事足りると思われるので、本稿は自分用のメモ(t-wada さんのを少しだけカスタマイズ & 補足)。
実行環境は以下。
| what | version |
|---|---|
| laptop | MacBook Pro (Retina 13-inch, Early 2015) |
| OS | OS X El Capitan 10.11.6 |
| ansible | 2.1.1.0 |
1. 事前準備
1.1. SSH
ansible では、コントローラ (Control Machine) から SSH 越しで管理対象ノード (Managed Node) を操作する。 今回は Control Machine も Managed Node も同一マシン (Macbook) なので、localhost に SSH できるようにする。
まず SSH の許可設定。 Mac で「システム環境設定」 > 「共有」 > 「リモートログイン」にチェック。
次にパスなしログインするために公開鍵を設定する。 こちらでも紹介したとおり、以下のようにする。
1 2 3 4 5 6 7 8 9 | |
1.2. Xcode
Homebrew をインストールするために必要なので、App Store から XCode をインストールする。 XCode インストール後、ライセンス同意する。
1
| |
ライセンス規約みたいな文章がつらつらと出てくるので、最後に「agree」と入力する。
XCode のコマンドラインツールもインストールする。
1
| |
1.3. Homebrew
Homebrew は Mac 用のパッケージマネージャ (yum とか apt 的なやつ。 Homebrew って、ホームブリューと読んでいるけどホームブルーのほうが正しい発音ぽい)。
公式サイトの案内に従い、以下のワンライナーで Homebrew をインストールする。
1
| |
上記ワンライナーでインストールするとたぶん最新版がインストールされるが、インストール後 brew doctor で古いと出力されたらアップデートする。
1 2 | |
1.4. Ansible
Ansible に必要な python はすでに 2.7 系がプリインストールされていたので、 そのまま Homebrew で Ansible をインストールする。
1 2 | |
2. Ansible Playbook を開発する
前回の Ansible でノート PC をセットアップ で作った仕組みにのせる。
t-wada さんの場合、1 枚の Playbook に変数やタスクを記述していたが、ありものは活用したいという思いがあり。
今回は以下のようなアレンジをした。
- インストールするパッケージを列挙した変数を
vars/common.ymlに切り出す
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
- CentOS などへもインストールするような共通のパッケージは
common/以下の role を利用する- 今回は tmux とzsh のみ
- Mac 固有のタスクは、
mac/以下に切り出す- brew (cask も) 用のrole を作る
- ricty フォントインストールは個別の処理が多かったため別の role で切り出す
- インベントリファイル
hostsに mac 用グループ[mac]を作る
1 2 | |
ディレクトリ構造は以下のようになった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
できあがった Playbook は Github にあげた。 momota/laptop-build
3. Ansible を実行する
3.1. ansible のログ出力設定
tee とかを使って Playbook の実行出力結果をファイルに保存しようと思ったが、ansible のログ機能を使った。
ansible.cfg に以下を記述。
1 2 | |
mac の場合、/etc/ansible/ansible.cfg がなかった (ディレクトリごとない) ので、~/.ansible.cfg を作成した。
3.2. ansible の実行
absible-playbook コマンドで実行する。
1 2 3 4 5 6 | |
HOMEBREW_CASK_OPTS="--appdir=/Applications" をつけないと、アプリケーションによって /Applications だったり、 ~/Applications だったりにシンボリックリンクリンクが作られてしまうとのこと。
ログインシェルを zsh に変更するタスクで sudo するので、-K オプション付き。
4. Playbook のトラブルフォロー
4.1. shell モジュールでcommand not found
Playbook をコピペして実行したら、shell モジュールで brew を呼んでいるタスクから
command not found エラーが返ってきた。
フルパスで指定し直す。
4.2. cask パッケージ名の誤り
/vars/common.yml にインストールしたい cask パッケージ名を定義するが、パッケージ名を謝って途中で処理がこけた。
もちろんググっても良いと思うが、事前に以下のコマンドなどで調べるとよさそう。
1
| |
4.3. cask インストールの処理停止
Homebrew cask でパッケージインストール途中で処理が止まることがあった。(2, 3回)
どんなに待っても止まったままなので、 Ctrl-c で中断する。
ansible-playbook コマンドに -vvv オプションなどを付けるも、原因はよく分からず。
たぶん、ansible ではなく brew 側に原因がありそう。
インストール処理で止まっているパッケージは、ansible で表示されているパッケージの、vars/common.yml での変数定義上の次のパッケージ。
途中で止まっているパッケージもインストール一覧に出力される。
1 2 | |
リストには表示されるものの、中途半端にインストールされていそうなので、
brew コマンドでインストールし直して Playbook を再実行する。
1 2 3 4 5 6 7 | |
なにも考えずに re-run できるのはうれしい。 (これが冪等性のパワーか)