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 Documentation。ANSIBLE_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にまとめて変数を渡すだけでよさそうですね。