ども、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 までいきたいです。