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 できるのはうれしい。 (これが冪等性のパワーか)