ようへいの日々精進XP

よかろうもん

boot2docker と test-kitchen で ansible の Playbook をテストする(2)〜 roles を利用する 〜

ども、Ansible 幼稚園、花組のかっぱです。 こちらの続編です。


Ansible における roles

参考

roles に関しては以下の三つの記事を参考にさせて頂きました。有難うございます。

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 以下にロール名ディレクトリを作成
  • ロール名ディレクトリ以下には filestasks 等のディレクトリを配置する
  • files には Playbook から利用するファイルを設置
  • tasks には Playbook のタスクを main.yml というファイル名で記載
  • roles の呼び出し元が site.ymlwebservers.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 を実行。

f:id:inokara:20150304095503p:plain

おお、イケた、イケた。


ということで...

roles 便利ですな...次こそ Serverspec までいきたいです。