読者です 読者をやめる 読者になる 読者になる

理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

Ansibleでhomebrewを管理する

environment technology

Ansible で自分の Mac のソフトウェアの構成管理をする場合、その中核に据えられるであろう Ansible のモジュールが homebrew です。
このモジュールはその名の通り、Ansible から homebrew のソフトウェアをインストール/link/アンインストール/アップデートできるというモジュールです (cask はまた別のモジュールが用意されています)

たとえば、homebrew を最新化し、全モジュールを upgrade した上でインストールする、といった処理を Ansible としてのタスクとして記述すると、以下のようになるでしょうか。

# homebrew を最新版にする
- name: common | brew update
  homebrew: update_homebrew=yes

# 全モジュールを upgrade する
- name: common | brew upgrade all
  homebrew: upgrade_all=yes

# 必要なパッケージをインストールする
- name: common | brew install osx.common.packages
  homebrew: name={{ item.name }}
    install_options={{ item.install_options | default(omit) }}
    state=upgraded
  with_items: osx.common.packages

ここで、osx.common.packages は変数として以下のように定義してやれば良いです。

osx:
  common:
    packages:
      - { name: ansible }
      - { name: cask }
      - { name: cmigemo }
      - { name: git, install_options: with-brewed-curl,with-brewed-openssl,with-brewed-svn,with-gettext,with-pcre }
      - 以下略

さて、ここで homebrew モジュールに渡す state オプションなんですが。

これだけでは何をしてくれるのか分からないので、[https://github.com/ansible/ansible-modules-extras/blob/devel/packaging/os/homebrew.py:title=ソース] を読んで整理してみました。

state オプション

state オプションは全部で 6 つであるとドキュメンテーションされていますが、実際には他にもエイリアスが存在しています。その関係は以下の通り。

state Alias 呼び出されるメソッド
installed present _install_packages()
head _install_packages()
upgraded latest _upgrade_packages()
linked _link_packages()
unlinked _unlink_packages()
absent removed, uninstalled _uninstall_packages()

以下では、個々の state 指定がどういう挙動を伴うか、といった点を説明していきます。

installed

既にインストールされているかどうかをチェックし、インストールされていない場合は brew install package でインストールを行います。
インストールされているかどうかは、brew info package の実行結果で判断されます。

head

基本的には installed 指定と変わりません。
ただし head 指定の場合は、インストールオプションに --HEAD が付与されます。

upgrade

upgrade 指定の場合は、インストール済か否かで挙動が異なります。
インストールされていない場合は、brew install package でパッケージがインストールされます。
一方で、インストール済の場合は、upgrade 可能な場合に限り brew upgrade package が実行されます。

upgrade 可能かどうかは、brew outdated の実行結果に対象パッケージが含まれているかで判断されます。

linked

対象パッケージがインストールされていなければエラーとなります。
インストールされていれば、brew link package でシンボリックリンクが作成されます。

unlinked

対象パッケージがインストールされていなければエラーとなります。
インストールされていれば、brew unlink package でシンボリックリンクが削除されます。

absent

対象パッケージがインストールされていなければエラーとなります。
インストールされていれば、brew uninstall package で対象パッケージが削除されます。