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 で対象パッケージが削除されます。