第4回からめちゃくちゃ間が空いていますが、ちょっと復活。
Ansibleのロール
Ansibleのロールはplaybookから読み込むためのモジュールを作成するものになります。
複雑な処理をAnsibleから行おうとすると、playbookでの記述が肥大化していくことになります。
そこで他の環境でも実行したい共通するような処理をrolesに切り出し再利用可能とします。
最小限構成
まずは必要最低限の構成で実行して確かめます。
ディレクトリ構成
ロールの動作を確かめるために最低限必要な構成は以下のようになります。
[ansusr@ctl-node pj1]$ tree pj1/ |-- group_vars/ |-- host_vars/ |-- hosts |-- roles/ | `-- hello/ | `-- tasks/ | `-- main.yml `-- test.yml
通常実行に必要なinventoryとplaybook、そしてロールを記述するためのroles/ディレクトリです。
roles/ディレクトリ配下に呼び出しに使用する任意のロール名(ここではhello)のディレクトリ、その下にtasksディレクトリ、処理を記述するmain.ymlファイルになります。
tasksディレクトリとmain.ymlファイルの命名は固定のようです。
記述内容
・main.yml(roles)
--- - name: hello world debug: msg: "hello world"
今回は動作確認のため必要最低限としています。
通常のplaybookと違うのはhostsなどの指定がないこと、ロールはモジュールとして呼び出される側になるので、hostsなどは呼び出し元のplaybookに従うからといった感じでしょうか。
・test.yml(playbook)
--- - hosts: web-server1 tasks: - name: test-playbook copy: dest: /tmp/web.txt content: web-server1 roles: - hello
あえて通常のtasksと並べて書いています。ロールの処理実行に最低限必要な記述としては以下の2行です。
tasks:と同階層に書くようです。
roles: - hello
動作確認
上記の構成で実行して、動作確認を行っておきます。
playbook上の処理に加えて、ロールの処理も実行されていることが確認できます。
[ansusr@ctl-node pj1]$ ansible-playbook -i hosts test.yml PLAY [web-server1] ************************************************************* TASK [Gathering Facts] ********************************************************* ok: [web-server1] TASK [hello world] ************************************************************* ok: [web-server1] => { "msg": "hello world" } TASK [test-playbook] *********************************************************** ok: [web-server1] PLAY RECAP ********************************************************************* web-server1 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [ansusr@ctl-node pj1]$
ベストプラクティス構成
以下からベストプラクティスの構成を確認しておきます。
ベストプラクティス — Ansible Documentation
ディレクトリ構成
ベストプラクティスとしては以下のようになっています。ここではさきほどのサンプルのhelloロールと並べて書いています。
[ansusr@ctl-node pj1]$ tree roles/ roles/ |-- common | |-- defaults | |-- files | |-- handlers | |-- mata | |-- tasks | |-- templates | `-- vars `-- hello `-- tasks `-- main.yml
・tasks
ロールのタスクとなる実行ファイルmain.ymlを配置する。
別のディレクトリから取り込みを行う。
・defaults
ロールで使用する変数のデフォルト値を設定する。
・vars
ロールで使用する変数を設定する。group_varsなどで上書きが行われない。
同一の変数が定義された場合、vars>group_vars>defaultsの順で適用される。
・files
copyモジュールなどで使用するファイルを配置する。
・templates
テンプレートファイルを配置する。
・mata
メタ情報の定義ファイルを配置する。
・handlers
特定条件で実行するイベントtaskを定義する。
動作確認
ものによってはまぁまぁ深そうで今の理解度では時間がかかりそうなので、簡単にできそうな変数のみ試してみます。
具体的にはdefaultsとvarsの優先順を確認します。
■ディレクトリ構成
必要なものだけ抜粋して表示します。
[ansusr@ctl-node ansible]$ tree pj1/ pj1/ |-- group_vars/ | `-- web.yml |-- hosts |-- roles/ | |-- common/ | | |-- defaults/ | | | `-- main.yml | | |-- tasks/ | | | `-- main.yml | | `-- vars/ | | `-- main.yml `-- test.yml
・group_vars/web.yml
fileとtextと二つの変数を定義します。
file: web.txt text: web_text
・/roles/common/defaults/main.yml
デフォルトの変数定義。file変数のみ定義します。
file: default.txt
・/roles/common/vars/main.yml
vars
の変数定義。text変数のみ定義します。
text: vars_text
・/roles/common/tasks/main.yml
ロールのメイン処理。copyモジュールによりfile(変数)のファイルを生成し、text変数の内容を記述します。
--- - name: file copy copy: dest: /tmp/{{ file }} content: "{{text}}"
・test.yml
メインのplaybookはcommon
ロールを呼び出すのみです。
--- - hosts: web-server1 roles: - common
・hosts
hostsは実行できればとりあえずなんでもよい。
#Inventory hosts-file [web] web-server1
■実行
以下の通り実行します。
[ansusr@ctl-node pj1]$ ansible-playbook -i hosts test.yml PLAY [web-server1] ************************************************************* TASK [Gathering Facts] ********************************************************* ok: [web-server1] TASK [common : file copy] ****************************************************** ok: [web-server1] PLAY RECAP ********************************************************************* web-server1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [ansusr@ctl-node pj1]$
ロールは正常に実行されていそう。
生成ファイルを確認。
[ansusr@ctl-node pj1]$ ll /tmp/web.txt -rw-rw-r--. 1 ansusr ansusr 9 11月 9 22:06 /tmp/web.txt
ファイルの中身を確認。
[ansusr@ctl-node pj1]$ cat /tmp/web.txt vars_text
ファイル名はgroup_varsが適用され、ファイルの中身にはroles/varsが記述されているので、roles/vars>group_vars>roles/defaultの優先順位で上書きされていくことが確認できました。
・前回 第四回
www.wantanblog.com
■参考書籍