13inch MacBook Pro を購入したので、開発環境の構築を行いました。
以前は、brew bundleで自動構築していたのですが、今回は Ansible を使って構築を行いました。このエントリは、Ansible Advent Calendar 2015 の 9 日目です。
今回の構築にあたっては下記のエントリを参考にしました。ありがたや。
Xcode / Homebrew のインストール
Xcode と Homebrew をインストールします。
$ sudo xcodebuild -license $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
コマンドの実行が完了したら、brew
コマンドが実行できるか確認しておきます。
$ brew -v Homebrew 0.9.5 (git revision 68bb4; last commit 2015-12-07)
Ansible のインストール
Homebrew で Ansible をインストールします。これもインストールが完了したら、ansible
コマンドが実行できるか確認しておきます。
$ brew install ansible $ ansible --version ansible 1.9.4 configured module search path = None
Playbook の実行
利用する Playbook などのファイルは、GitHubにて公開しています。git clone
して、ansible-playbook
コマンドで実行するだけです。バージョンアップもこのコマンドで実行できるので楽ですね。
https://github.com/shin1x1/osx-provisioning-with-ansible
$ git clone https://github.com/shin1x1/osx-provisioning-with-ansible $ cd osx-provisioning-with-ansible $ ansible-playbook -i hosts osx.yml
dotfile ロールと ssh ロールを合わせて実行する際は、osx.yml にてコメントアウトしている箇所をアンコメントして、下記を実行します。
$ ansible-playbook -i hosts osx.yml
Ansible コード(Playbook)構成
Ansible コードは、下記のような構成です。
- host_vars
- Role
- Playbook
host_vars
インストールするリポジトリやパッケージの指定は、host_vars/localhost
で行います。パッケージを追加する際は、このファイルに記述していきます。パッケージは、リストの要素に文字列として指定します。要素はディクショナリでの指定も可能で、その場合、name キーにパッケージ名、state キーにステータス、install_option キーにインストールオプションを記述します。
install_option キーで注意が必要なのが、brew install コマンドで指定する --with-phpdbg
といったハイフン2つからはじまるオプションです。ここでは、ハイフンを除いて with-phpdb
のようにします。(ハマった)
--- homebrew_repositories: - homebrew/php homebrew_packages: - readline - zsh - autojump - git - ctags - tmux - tig - ansible - wget - curl - jq - vim - reattach-to-user-namespace - postgresql - mysql - sqlite - { name: php70, install_option: with-phpdbg } - php70-mcrypt - php70-xdebug - php70-opcache - php70-pdo-pgsql - php70-apcu - { name: php70-redis, state: head } - composer - { name: php70-memcached, state: head, install_option: with-sasl } - phpunit - phpunit-skeleton-generator - rbenv - ruby-build - python - go - hg - awscli - npm - graphviz - tree - heroku-toolbelt homebrew_cask_packages: - java - dash - phpstorm - pycharm-ce - iterm2 - google-chrome - firefox - virtualbox - vagrant - kobito - dropbox - evernote - skitch - slack - github-desktop - sequel-pro - openoffice - bettertouchtool - the-unarchiver - coteditor - istat-menus - bartender - skype - xmind - hipchat - atom - livereload - chefdk - clipy - marked - flash - kindle - adobe-reader
Role
roles ディレクトリ以下にロールを配置しています。各ロールの実装はソースを見て頂くとして、ここではそれぞれのポイントだけに記します。
- homebrew - homebrew タスクを実行するロール(brew install相当)
- homebrew-cask - homebrew-cask タスクを実行するロール(brew cask install相当)
- ruby - rbenv による Ruby のインストール
- dotfiles - 各種設定ファイルであるドットファイルをインストール(Dropbox へシンボリックリンクを張る)
- ssh - ssh 関連の設定を行う
ssh ロールのタスクは、ansible-vault
コマンドで暗号化されており、復号にはパスワードが必要です。dotfiles と ssh ロールは、私以外不要なのでコメントアウトしています。
PHP は、Homebrew で入れていますが、phpenv のロールを書いてインストールしようと思ってます。
Playbook
設定値は host_vars、実装はロールに置いているので、Playbook はシンプルです。
environment キーで HOMEBREW_CASK_OPTS
を環境変数として指定しています。HOMEBREW_CASK_OPTS については、こちら。
あとは、roles キーで実行するロールを指定するだけです。
--- - hosts: localhost gather_facts: no become: no environment: HOMEBREW_CASK_OPTS: "--appdir=/Applications" roles: - homebrew - homebrew-cask - ruby #- dotfiles #- ssh
Dropbox、Evernote の同期
Dropbox や Evernote などの同期を行います。Dropbox は、同期に時間がかかるので、先に実行しておきます。ドットファイルは、Dropbox に置いてるので、同期完了後に dotfiles ロールを実行します。
さいごに
brew bundle の時もそうでしたが、自動にインストールできるのはホント楽ですね。Infrastructure as Code とか言ってますが、自分の面倒な作業が自動で片付くのは、その良さを実感できます。
Ansible は癖が少なく、素直にタスクを記述して実行するだけなので、ベターシェルスクリプトとしてオススメです。