理系学生日記

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

Ansibleでhomebrewを管理する

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

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

|yaml|

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 は変数として以下のように定義してやれば良いです。

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