homebrew, cask の ansible による設定

背景

Yosemite 関係で homebrew が混乱してしまったので、すべて消して再インストールしました。せっかくなので、homebrew 関係も ansible 化できないかと思ったところ、すでに AnsibleでHomebrew, Cask, Atomエディターのパッケージを管理するという記事を発見しました。ansible-galaxy に登録してくれているようなので、便利に使わせていただきます。ということで、今回は ansible-galaxy の設定方法について書きます。

初期設定部分

ansible-galaxy は roles の共有サービスでさまざまな roles が登録されています。今回は、ansible の playbook を使えるようにして、ansible-galaxy から roles を取得するまでを shell スクリプトで行います。その後 ansible-playbook でパッケージ達をインストールし、インストール後の作業までを行います。

初期設定用のスクリプトは以下のようになりました。

#!/bin/sh
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
brew doctor
brew install ansible

ansible-galaxy install --roles-path=./roles hnakamur.homebrew-packages
ansible-galaxy install --roles-path=./roles hnakamur.homebrew-cask-packages
ansible-galaxy install --roles-path=./roles hnakamur.atom-packages 

ansible 自体は brew でいれるので、ansible-playbook には入れられませんので、こちらのスクリプトでインストールします。ansible-galaxy では、roles の下に上記サイトで登録された roles 達をインストールしています。

ansible-playbook

今回の playbook は以下のようになりました。解説用なのでパッケージは少なめに書いています。実際にはこの他にも沢山インストールします。homebrew_packages_packages は homebrew でインストールするパッケージ一覧です。install_options で追加オプションなどが設定できます。
また、homebrew_cask_packages_packages は GUI アプリケーションの管理用です。AppStore で販売しているものは不可能ですが、ダウンロードタイプのものはかなり揃っているようです。ここでは、Google ChromeAtom エディタを例にしてみました。デフォルトでは /opt/homebrew-cask/Caskroom に実体がインストールされ、~/Applications フォルダにはアプリへのショートカットが作成されるようです(当初、環境変数を設定して /Applications に入れるように設定を記述していましたが、学生の権限でここに置かせるのは面倒なので、link はデフォルトの自分のフォルダのままにしています)。なお、Yosemite からは Alfred の代わりに Spotlight をランチャーとして使うようになりましたが、Spotlight はちゃんと実体を探してくれました。
最後は、先ほどインストールした Atom エディタのパッケージ管理です。少し重いですが、学生に使わせるにはよいエディタかなと思いますので、いろいろなパッケージを試してみたいと思います。
(後日修正: aquaterm 対応の gnuplot を入れてみました。aquaterm が先にインストールされるように、cask を先に処理するようにしました。また install_options がうまく動いていませんでした)。

---
- hosts: localhost
  connection: local
  gather_facts: no
  sudo: no
  vars:
    homebrew_packages_taps:
      - homebrew/binary
      - homebrew/dupes
    homebrew_packages_packages:
      - { name: readline }
      - { name: openssl, state: linked }
      - { name: fish }
      - { name: rbenv }
      - { name: ruby-build }
      - { name: gnuplot, install_options: with-x,with-aquaterm,latex,pdf }
    homebrew_cask_packages_packages:
      - atom
      - google-chrome
      - aquaterm
    atom_packages_packages:
      - project-manager
      - recent-files
      - vim-mode
      - japanese-wrap
  roles:
    - hnakamur.homebrew-cask-packages
    - hnakamur.homebrew-packages
    - hnakamur.atom-packages
    - ruby-build

パッケージ管理などが終了したら、最後に ruby-build という role が実行されます。roles/ruby-build/main.yml は以下のようになっています。ここでは、rbenv versions としたときに、vars で設定したインストールしたいものが入っているかを調べ、入っていればインストールはスキップするようにしています。

---
  - name: 現在インストールされているバージョン一覧を得る
    command: rbenv versions
    register: ruby_versions
    changed_when: false
  - name: readline の prefix を得る
    command: brew --prefix readline
    register: readline_prefix
    when: ruby_versions.stdout.find('{{ install_version }}') == -1
  - name: openssl の prefix を得る
    command: brew --prefix openssl
    register: openssl_prefix
    when: ruby_versions.stdout.find('{{ install_version }}') == -1
  - name: rbenv install {{ install_version }}
    command: rbenv install {{ install_version }}
    environment:
      RUBY_CONFIGURE_OPTS: "--with-readline-dir={{ readline_prefix.stdout }} --with-openssl-dir={{ openssl_prefix.stdout }}"
    when: ruby_versions.stdout.find('{{ install_version }}') == -1
  - name: デフォルトを確認
    command: rbenv global
    register: ruby_global
    changed_when: false
  - name: デフォルトを設定
    command: rbenv global {{ install_version }}
    when: ruby_global.stdout.find('{{ install_version }}') == -1

vars にはインストールしたいバージョンを書いておきます。今回は 2.1.3 にしてみました。

---
  install_version: 2.1.3

今回も bitbacket にリポジトリを置きました.必要であればクローンしてください.
https://bitbucket.org/hkob/ansible_homebrew