ども、Ansible 幼稚園、花組のかっぱです。 こちらの続編です。
Ansible における roles
参考
roles に関しては以下の三つの記事を参考にさせて頂きました。有難うございます。
- Playbook Roles and Include Statements — Ansible Documentation
- Ansibleのroleを使いこなす - Qiita
- RolesでAnsibleのPlaybookを整理してみよう|株式会社INDETAIL(札幌/東京)(iPhone/iPad/iOS/Android)
roles と書くと Playbook を役割毎に分割する仕組みか何かかと思っていましたが、上記の記事を整理させて頂くと...
- ルールに則ったディレクトリ構成とファイル名で設置しておけばディレクトリパス等を Ansible が自動解釈してくれる
- 自動解釈して適宜 Playbook を include してくれる
- 従来は include で Playbook をインクルードする仕組みはあった
なるほど、なるほど。よく解っていませんが roles を使うことで Playbook 間の依存関係をうまく吸収しつつ Playbook の可読性を上げることが出来そうです。
なぜ roles にたどりついたか
以下のような Playbook では test-kitchen では skipping となってしまって困っていたら...
--- - hosts: app sudo: yes gather_facts: no tasks: - name: file multipul upload copy: src={{ item }} dest=/path/to/ owner=root group=root mode=0644 with_fileglob: - ../../files/path/*
上記のように roles を使ったら相対パスもよしなに解決してくれまっせとあったので、こりゃあ使わにゃあかんということで作り替えました。
リファクタでくたくた
roles のディレクトリ構成
roles は前述の通り各 Playbook の依存関係やファイルパス等をよきに計らってくれる代償として Ansible 指定のディレクトリ構成、ファイル名で定義する必要があります。
site.yml
webservers.yml
fooservers.yml
roles/
common/
files/
templates/
tasks/
handlers/
vars/
defaults/
meta/
webservers/
files/
templates/
tasks/
handlers/
vars/
defaults/
meta/
ポイントは...
roles以下にロール名ディレクトリを作成- ロール名ディレクトリ以下には
filesやtasks等のディレクトリを配置する filesには Playbook から利用するファイルを設置tasksには Playbook のタスクをmain.ymlというファイル名で記載- 各
rolesの呼び出し元がsite.ymlやwebservers.ymlとなる
詳しくはこちらを...。
test-kitchen 環境で...
以前に作成した test-kitchen 環境は以下のように修正しました。
.
├── Gemfile
├── Gemfile.lock
├── app.yml
├── common.yml
├── inventories
│ └── foo
├── roles
│ ├── app
│ │ ├── files
│ │ │ ├── hogehoge.conf
│ │ │ └── fugafuga.conf
│ │ └── tasks
│ │ └── main.yml
│ └── common
│ ├── files
│ │ └── common.conf
│ └── tasks
│ └── main.yml
└── test
└── integration
└── default
roles/app/tasks/main.yml は以下のような内容になりました。
- name: Config file upload copy: src={{ item }} dest=/etc/httpd/conf.d/ owner=root group=root mode=0644 with_fileglob: - ./*
上記を呼び出す app.yml は以下のような内容になりました。
- hosts: app sudo: yes roles: - common - app
common も呼び出しておいて app も呼び出されます。
さらに .kitchen.local.yml は以下のようになりました。
--- driver: name: docker provisioner: name: ansible_playbook roles_path: roles platforms: - name: centos-6 driver_config: image: inokappa/centos-ansible require_chef_omnibus: false suites: - name: app provisioner: playbook: app.yml hosts: app
kitchen converge
ひとまず kitchen converge を実行。

おお、イケた、イケた。
ということで...
roles 便利ですな...次こそ Serverspec までいきたいです。