概要
Ansibleでmacの環境構築する際、id:t-wada さんの上記の記事を参考したのですが、 Ansible Best Practicesに沿っていなかったので、書き直してみました。
Ansibleを動かすまで
こちらは、t_wadaさんの記事のままです。
sudo xcodebuild -license xcode-select --install ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" brew doctor brew update brew install python brew install ansible
どこを直したのか
hoshinaoshi/macbook-provisioning
本家とforkしたリポジトリを比較しながら、修正した点を挙げていきます。 階層構造も修正しています。
【本家】
. ├── LICENSE ├── README.md ├── hosts ├── localhost.yml
【修正後】
. ├── LICENSE ├── README.md ├── ansible.cfg ├── group_vars ├── hosts ├── localhost.yml ├── roles │ ├── homebrew │ │ ├── defaults │ │ ├── files │ │ ├── handlers │ │ ├── meta │ │ ├── tasks │ │ │ └── main.yml │ │ ├── templates │ │ └── vars │ │ └── main.yml │ ├── homebrew-cask │ │ ├── defaults │ │ ├── files │ │ ├── handlers │ │ ├── meta │ │ ├── tasks │ │ │ └── main.yml │ │ ├── templates │ │ └── vars │ │ └── main.yml │ ├── oh-my-zsh │ │ ├── defaults │ │ ├── files │ │ ├── handlers │ │ ├── meta │ │ ├── tasks │ │ │ └── main.yml │ │ ├── templates │ │ └── vars │ └── ricty │ ├── defaults │ ├── files │ ├── handlers │ │ └── main.yml │ ├── meta │ ├── tasks │ │ └── main.yml │ ├── templates │ └── vars └── site.yml
site.ymlを作成し、localhost.ymlをinclude
ベストプラクティスではsite.ymlをmaster playbookとします。 また、プロビジョニング対象の役割(production, stagingなど)ごとに実行するroleをまとめたplaybookも作ります。 今回はlocalhost.ymlのみですね。*2
これらのファイルはroleをincludeするだけに留め、ここに細かいタスクを書いていくことはしません。(後述)
ロールの割り振り
元々のlocalhost.ymlのタスクは大きく4つの処理をしています。
今回はローカル環境のみが対象ですが、複数のプロビジョニング対象があった場合に、個別に差し込めるようにするため、 これらのタスクをrolesディレクトリ配下にそれぞれの役割ごとに分割します。 directory-layout
loclhost.ymlに列挙された変数を各ロールに振り分ける。
loclhost.ymlにhomebrew_taps, homebrew_packages, homebrew_cask_packagesの3つが定義されていましたが、 これらはhomebrewとcaskで使用するので、
./roles/homebrew/vars/main.yml
.roles/homebrew-cask/vars/main.yml
に記述します。
./roles/hogehoge/vars/main.yml
に変数を記述すると
./roles/hogehoge/tasks/main.yml
の実行時に自動で変数を読み込み、タスク内で使用することができます。
localhost.ymlに記述されているhandlersはricty用なので、ricty/handlers/main.ymlに移動
localhost.ymlに記述されているhandlerは、よく見るとRicty用の処理であるため、Rictyロールのhandlerとして定義します。 こちらは、varsと同様にhandlerも同role内のhandlerディレクトリに記述していれば、notifyをした際に呼び出されます。
- name: run fc-cache shell: fc-cache -vf
localhost.ymlでtasksとして記述された内容をroleに任せる。
これらのファイルはロールをインクルードするだけに留め、ここに細かいタスクを書いていくことはしません。(後述)
ここまでの書き換えで、各ロールにvars, tasks, handlerを分けることができたので、 localhost.ymlではロールをインクルードするだけにします。
--- - name: Setup my MacBook hosts: localhost connection: local gather_facts: no roles: - { role: homebrew, tags: [ homebrew ] } - { role: homebrew-cask, tags: [ homebrew-cask ] } - { role: oh-my-zsh, tags: [ oh-my-zsh ] } - { role: ricty, tags: [ ricty ] }
だいぶスッキリしましたね。
また、tagを切っておくと、指定したタグだけ実行 / 指定したタグをスキップなどができるので、追加しておきます。
ansible-playbook site.yml --tags "homebrew,ricty"
ansible-playbook site.yml --skip-tags "oh-my-zsh"
playbook実行時の引数を極力減らせるように設定
HOMEBREW_CASK_OPTS="--appdir=/Applications" ansible-playbook -i hosts -vv localhost.yml
実行時にhostsの設定をしたり、HOMEBREW_CASK_OPTSを設定したりするのはめんどくさいので、
ansible.cfgを作成し、デフォルトの動作を設定をします。
[defaults] hostfile = ./hosts
環境変数については、homebrew-caskのタスクの一部として実行するようにします。
- name: HOMEBREW_CASK_OPTS設定 shell: export HOMEBREW_CASK_OPTS="--appdir=/Applications" ...後続の処理がずらずら〜
ここまでの設定で、実行時のコマンドが
HOMEBREW_CASK_OPTS="--appdir=/Applications" ansible-playbook -i hosts -vv localhost.yml
↓
ansible-playbook -vv site.yml
となりました。
シンプル!
まとめ
以上でAnsible ベストプラクティスを適用した、Mac の開発環境構築を自動化する (2015 年初旬編)です。
"mac ansible"などで検索すると、localhost.ymlにtasksがばーーーーーっと書かれたplaybookをよく目にする印象があります。
複数のプロビジョニング対象が存在する場合は、ベストプラクティスが有効だと思いますが、 構築する対象がローカル環境のみで、処理(や、ロール)が少ないのであれば、1ファイルにゴリゴリ書いても良いのではないかと感じました。
ただ、実際は、開発スタートをするまでにrbenvの設定をしたり、ミドルウェアの設定をしたりなんだりすると、localhost.ymlが肥大化してしまうのではないかと考えられるため、早め早めにロールだけでも分けて記述するのが落とし所かと思います。
こちらにコードを置いておきます。
https://github.com/hoshinaoshi/macbook-provisioning
今回Ansibleを初めて触ってみたのですが、ymlで書くのが地味に楽でした。
Ansibleの処理も「Ansible {{やりたいコマンド}}」で検索 => 1つ目の記事ではい理解〜というような感じでした。
自分は、初めての技術に触れるときは、初心者用の書籍を購入して、一読するのですが、Ansibleにおいては下記の書籍を買いました。