(アホみたいな不具合が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ファイルも別のフォルダに置く?
- もうちょっと英語ドキュメントちゃんとする