SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【Ansible】入門⑤ Ansibleロール(roles)について

第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

通常実行に必要なinventoryplaybook、そしてロールを記述するための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を定義する。

参考:変数の優先順位
https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_variables.html#ansible-variable-precedence

動作確認

ものによってはまぁまぁ深そうで今の理解度では時間がかかりそうなので、簡単にできそうな変数のみ試してみます。
具体的には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 119 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


■参考書籍