Edited at

Ansibleのロールベストプラクティスにあえて抗ってみるプラグイン

More than 3 years have passed since last update.

(アホみたいな不具合が2箇所あったので、これから直します)


まえがき

先月あったAnsible Meetup Tokyoに参加した際のLT枠でyunanoさんが発表していたこの内容に触発されて、 rolesフォルダに置いてあるYAMLファイルの中身をロールとして展開して使うようにするプラグイン というのを作成してみました。

途中雑になりながらもテストコード書きながら実装進めてみたり、サンプルのplaybookも準備しながらコード書いたので実用は多分可能です。実用性は保証できないですが。

あと、「抗う」なんて書いてはみたもののある程度複雑なら普通にベストプラクティスに従うといいと思います。


実物

ここ↓

https://github.com/attakei/ansible-packed-role-plugin

こんな動きします。


何をしてくれるか


  • コールバックプラグインの場所に plugins/packed_role.py を含まれるようにする

  • Playbookに指定されたロールがroles/フォルダにYAMLファイルとして置かれている

上記のように設定してPlaybookを実行すると、YAMLファイルをロールとして扱って動いてくれます。


もうちょっと細かく

↓のようなフォルダ構成を用意します。rolesフォルダの中にはYAMLファイルがあるだけでフォルダは無いです。

+ hosts

+ roles
+ nginx.yml
+ webserver.yml

playbook(webserver.yml)の中身。

- hosts: web

roles:
- nginx

nginx.ymlの中身。

tasks:

- name: Install nginx
sudo: yes
yum: name=nginx state=present
- name: Enable service nginx
sudo: yes
service: name=nginx enabled=yes state=started
handlers:
- name: Reload nginx
sudo: yes
service: name=nginx state=reloaded

playbookを実行します。

$ ansible-playbook -i hosts webserver.yml

問題なくnginxのロールが実行されて、フォルダ構成が以下のように変わると思います。

+ hosts

+ roles
+ nginx/
+ defaults/
+ main.yml
+ files/
+ handlers/
+ main.yml
+ tasks/
+ main.yml
+ templates/
+ vars/
+ main.yml
+ nginx.yml
+ webserver.yml


副作用とか

現時点のプラグインだとrolesフォルダにロールの内容を直接展開してしまうため、余計なファイル群を大量に作ります。(それこそベストプラクティス通りのフォルダとmain.ymlを生成します)

+ roles

+ nginx/
+ files/
+ nginx.conf
+ tasks/
+ main.yml
+ nginx.yml

例えば、上のようなフォルダ構成になっていた場合には、nginxロールを指定したplaybook実行時ににnginx.ymlの中身を無条件展開するため、nginx/tasks/main.ymlを編集していた場合は中身を上書きしてしまいます。


やってみたいこと(やるべきこと)


  • YAMLファイルの出力先を既存のrolesフォルダとは別にする

  • main.yml以外を出力できるようにする

  • YAMLファイルも別のフォルダに置く?

  • もうちょっと英語ドキュメントちゃんとする


謝辞(参考にしたページまとめ)