Shin x Blog

PHPをメインにWebシステムを開発してます。Webシステム開発チームの技術サポートも行っています。

OSX の開発環境を Ansible で自動構築する(El Capitan / Yosemite)

13inch MacBook Pro を購入したので、開発環境の構築を行いました。

f:id:shin1x1:20151208182126p:plain:w500

以前は、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

DropboxEvernote の同期

DropboxEvernote などの同期を行います。Dropbox は、同期に時間がかかるので、先に実行しておきます。ドットファイルは、Dropbox に置いてるので、同期完了後に dotfiles ロールを実行します。

さいごに

brew bundle の時もそうでしたが、自動にインストールできるのはホント楽ですね。Infrastructure as Code とか言ってますが、自分の面倒な作業が自動で片付くのは、その良さを実感できます。

Ansible は癖が少なく、素直にタスクを記述して実行するだけなので、ベターシェルスクリプトとしてオススメです。