RのパッケージをインストールするAnsible Moduleをつくりました

Rは主にWindows環境で使っていて、Linux環境は必要なときにつくって壊す、ということをしています。で、環境構築をAnsibleでやれないかな?と思ったときに、こういう書き方をしたくなります。

  - name: Install hadleyverse
    cran: name={{ item }}
    with_items:
      - ggplot2
      - dplyr
      - tidyr
      - purrr
      ...

もちろんそんなモジュールは標準では存在しないので、つくってみました。(モジュール書いたら負けな気もしつつ…)

注意点

作りが適当なので、以下のことは手動で対応する必要があります。

  • Rのインストール
  • 依存ライブラリのインストール(例えばcurlパッケージのインストールには、Ubuntuで言うとlibcurl4-openssl-devみたいなAPTパッケージが必要、というような話)
  • すでにインストールされているパッケージのアップデート

インストール

モジュールパスに指定する

詳しい説明はこのへん:Developing Modules — Ansible DocumentationANSIBLE_LIBRARY環境変数で指定したり、--module-path引数で指定したりできます。

$ git clone https://github.com/yutannihilation/ansible-module-cran
$ ansible-playbook --module-path=./ansible-module-cran/library your-playbook.yml

Ansible Galaxy

Ansible Galaxyはロールを配布する仕組みなので、モジュールのインストールのためだけに使うのは本来違うっぽいんですが、そういう例を見かけたので真似してみました。

$ ansible-galaxy install yutannihilation.module-cran

こうしておくと、以下のようにroleを設定すれば、cranモジュールが使えるようになります。

- hosts: localhost
  connection: local
  roles:
    - { role: yutannihilation.module-cran }
  tasks:
    - name: install R pakcages
      cran: name={{ item }} state=present
      with_items:
        - dplyr
        - ggplot2
        - purrr
        - tidyr

感想

ここまで書いておいてなんですが、モジュールを自作するっていうのはなんかやってみてイマイチな感じがしました…。たぶんansible-module-extraにプルリクエストを投げるくらいの気概がないとだめなのかも。

この程度ならふつうにtaskにまとめて変数を渡すだけでよさそうですね。