Ansible の共通処理をどこに書くの問題

普段、サーバーのプロビジョニングツールとして Ansible で利用することが多いのですが、その時いつもモヤモヤするのが共通処理をどこに書くのが正しいのだろうかという問題があります。

www.ansible.com

共通処理とは?

ここで私が考えている共通処理というのは、全部のサーバーではないが場合によっては、対象のサーバーでは同じような処理を使いまわしたいと思うような処理です。
全サーバーで共通の処理として実行するものに関しては、roles/common の配下に入れておいて各 playbook から include してあげるというのをやっている方も多いかと思いますが、今回は異なります。
また、 Ansible のディレクトリ構成を考えると、roles の下に共通処理が来ると少し気持ちが悪かと思います。 例えば、ruby をインストールするディレクトリは、 roles/ruby となってしまって、実際にサーバーの役割として配置しているディレクトリ(例: roles/api)と混ざってあまりよくない感じになってしまいます。

じゃ、どこに?

そこで無理やりの解決策として、共通処理に関しては、prefix として _ (アンダーバー)を利用することにしました。
例えば、 roles/_ruby となります。この様にすることによって、通常の role のディレクトリとは異なっていると直感的に分かります。
そして、この共通処理を各 role の task から include_role というモジュールを使って呼び出します。

include_role - Load and execute a role — Ansible Documentation

roles/api/tasks/main.yml

- name: Install ruby
  include_role:
    name: _ruby
roles
├── _ruby
│   └── tasks
│       └── main.yml
├── api
│   ├── tasks
│   │   └── main.yml

この構成にしてからは、自分としてはかなりスッキリと Ansible の処理が書けるようになりました。

さいごに

あとは、この共通処理を他のプロジェクトでも利用できるようにしても良いのかなぁと漠然と考えています。 もしこの辺りでご意見あれば、是非コメントください 🙇