理系学生日記

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

AppStoreのアプリをAnsible Playbookからインストールする

Mac で AppStore からのインストールやアップデートをコマンドラインから実行できるようになりました。

mas-cli - Mac App Storeのシンプルなコマンドラインインターフェイス | ソフトアンテナ

コマンドラインから実行できるのであれば、当然 Ansible の Playbook にも書けることになるので、これまで homebrew (tap)からインストールするアプリは ansible、AppStore は手動でインストール、みたいなことになっていたのが Ansible に一元化できることになります。 AppStore のアプリをインストールするツールは mas (Mfac App Store) というのですが、この mas でアプリをインストールする場合、引数にはアプリ名ではなく ID を取ることになります。*1 従って、シンプルに Playbook を書くのであれば、以下のようになります。

- hosts: localhost
  connection: local
  gather_facts: no
  become: no
  vars:
    mas:
      - name: The Unarchiver
        id: 425424353
      - name: Evernote
        id: 406056744
      - nane: PopClip
        id: 445189367
  tasks:
    # mas で AppStore のアプリをインストールする
    # 大容量ファイルのダウンロード等、時間がかかるタスクなので、本タスクを実行したい場合は明示的に
    # -e "thorough=true" を指定する
    # 例: ansible-playbook localhost.yaml -e 'thorough=true'
    - name: install appstore applications
      command: mas install "{{ item.id }}"
      with_items: mas
      when: thorough == "true"

command モジュールを使用しているので、このタスクを実行すると常に "changed" になってしまうのが難点。 また、mas install コマンドは、既にインストール済のソフトウェアであっても無条件でアプリをダウンロード、インストールしてしまうため、このタスクを動かしてしまうと帯域・時間を大きく消費します。 さすがに 1 GB を超えるアプリを何度もダウンロード・インストールするのは嫌なので、ここでは when 句を指定しています。このあたりの話については以下エントリで。

明示的に指定した場合にのみ Ansible のタスクを実行する - 理系学生日記

*1:アプリ名ではアプリを一意に特定できないからだと思います