Weekly Report

途中で寝てももいいよね,ゆとりだもんね

購入理由

2012年に買ったMac Book Air 13-inchの性能にずいぶん物足りなさを感じていた. 具体的には,仮想マシンをよく立てていたので,割り当てられるメモリや容量に ずいぶん不満があったからだ. 最近では,VAIO Zなんかもかっこよかったが,こだわりがなかったのでMacBook Proにした. Apple製品はこだわらない人の方が合う気がする.

作業環境の構築

MacBook Air時代はhomebrew, homebrew caskを使っていた. 特に不満はないので今回もこの2つをメインに使う. 加えて,最近の若者に流行っている自動化ツールも 使ってみる.

作業内容

homebrew, homebrew cask, Ansibleで今風? (2015年春)のOS X用の環境構築.

参考にした記事は Macの開発環境構築を自動化する (2015年初旬編)

Xcodeのインストール

全ての作業の前にXcodeをいれなければならない.

$ xcode-select -install

お茶でも飲みながら終わるのを待つ.

Homebrewのインストール

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew doctor
$ brew update # もし上のコマンドで必要と言われたら

Ansibleのインストール

Ansibleを動かすにはPython2.7が必要だが,Pythonはpyenvで管理したいので今のうちにいれておく. 詳しくは前のエントリを参考に

$ brew install pyenv-virtualenv
$ pyenv install 2.7.8
$ pyenv global 2.7.8 && pyenv rehash
$ pyenv versions
  system
* 2.7.8 (set by /Users/<user>/.pyenv/version)
$ brew install ansible

Ansibleによる自動化

プロビジョニング用ディレクトリの作成

ホームディレクトリに.macbook-provisioningというディレクトリを作る. そこにivententoryファイルも配置.

$ mkdir .macbook-provisioning && cd .macbook-provisioning
$ echo 'localhost' > hosts'

PlayBookの作成

先に挙げたエントリからほとんど変えずに設定. パッケージは前のマシンのうちすぐ思い出せるものだけにした. 残りは必要になったら入れることにしよう.

- hosts: localhost
  connection: local
  gather_facts: no
  sudo: no
  vars:
    homebrew_taps:
      - caskroom/cask
    homebrew_packages:
      - { name: git }
      - { name: tig }
      - { name: reattach-to-user-namespace }
      - { name: mercurial }
      - { name: tmux }
      - { name: zsh }
      - { name: tmux }
      - { name: ansible }
      - { name: vim, install_options: with-lua }
      - { name: ctags }
      - { name: peco }
      - { name: autojump }
    homebrew_cask_packages:
      - { name: iterm2 }
      - { name: firefox }
      - { name: google-chrome }
      - { name: virtualbox }
  tasks:
    - name: add tap repos
      homebrew_tap: tap={{ item }} state=present
      with_items: homebrew_taps

    - name: update homebrew
      homebrew: update_homebrew=yes

    # brew
    - name: install brew packages
      homebrew: >
        name={{ item.name }}
        state={{ item.state | default('latest') }}
        install_options={{
          item.install_options | default() | join(',')
          if item.install_options is not string
          else item.install_options
        }}
      with_items: homebrew_packages
      register: brew_result
    - name: make package info dir
      file: path=brew_info state=directory
    - name: save package info
      shell: brew info {{ item }} > brew_info/{{ item }}
      with_items: brew_result.results | selectattr('changed') | map(attribute='item') | map(attribute='name') | list

    # cask
    - name: install homebrew-cask
      homebrew: name=brew-cask state=latest
    - name: install packages
      homebrew_cask: name={{ item.name }} state={{ item.state | default('installed') }}
      with_items: homebrew_cask_packages
      register: cask_result
    - name: make package info dir
      file: path=cask_info state=directory
    - name: save package info
      shell: brew cask info {{ item }} > cask_info/{{ item }}
      with_items: cask_result.results | selectattr('changed') | map(attribute='item') | map(attribute='name') | list
  handlers:
    - name: run fc-cache
      shell: fc-cache -vf

自動化

$ ansible-playbook -i hosts -v localhost.yml

どんどんログが流れていく.気持ちいい. ただし,caskで入れるGUIアプリはいくつか手動で認証が必要なので, 完全な自動化とはいえない.

それでも大部分をやってくれるだけでうれしい.

感想

環境構築は毎回ほとんど手動だったので,これだけでもずいぶん便利だった. とりあえずdotfilesに突っ込むことに.