テスト用のplaybookで利用できるモジュールたち

Ansibleでテスト用のplaybookを書く時の、一般的な使い方をまとめておきます。

環境情報

  • ansible 2.7.10

wait_forモジュール

wait_for モジュールは、ある条件に合致するまで処理を待ってくれる(条件に合致しない場合タイムアウトする)というモジュールです。

Ansible - wait_for

port生死の確認

port パラメータを指定することで、指定したポートへポーリングして生死を確認してくれます。

    - name: ポート生死の確認
      wait_for:
        port: 80
        state: started
        msg: 'nginx port is dead'
        timeout: 5

ファイル内文字列の確認

path パラメータを利用することで、ファイルの存在確認や、ファイル内文字列の存在確認をしてくれます。

- name: server_tokens無効化の確認
  wait_for:
    path: /etc/nginx/nginx.conf
    search_regex: '^\s*server_tokens\s*off;$'
    state: present
    msg: 'server_tokens is not set'
    timeout: 5

assertモジュール

一般的なassert文と同じような使い方ができます。

Ansible - assert

コマンド実行結果を確認

以下はサンプル。ngixnのバージョン取得コマンドを実行して、その実行結果より現在のバージョンを判断するテスト内容。

- name: nginxのバージョン取得
  command: 'nginx -v'
  register: nginx_version
  changed_when: false
  ignore_errors: true
  check_mode: no
- name: nginxのバージョン確認
  assert:
    that:
      - "'nginx/1.15.12' in nginx_version.stderr"
    fail_msg: 'nginx version is not 1.15.12'

failモジュール

fail モジュールは、 when の条件に合致した場合に、メッセージを出力するような処理です。

Ansible - fail

webサイトのページ確認

サンプル。webサイトにアクセスし期待した文字列がない場合に、タスクがfailedとなると同時にメッセージを出力します。

- name: webサイトへのアクセス
  uri:
    url: http://localhost/
    return_content: yes
  register: webpage
  ignore_errors: true
  check_mode: no
- name: webサイトの確認
  fail:
    msg: 'web service is down'
  when: "'zunchan' not in webpage.content"

参考:テスト用playbookを配置するPath

テスト用playbookは、実際の処理を実行するplaybookと対になるよう配置すると、管理がしやすくなります。

nginx というロールがあるとして、こんな感じで test.yml というテスト用playbookファイルを置いてあげます。

.
├── site.yml
└── roles
    └── nginx                        
        ├── tasks                    
        │   ├── main.yml             
        │   └── test.yml             

site.yml

---
- name: ansible処理
  hosts: all
  become: true
  tasks:
    - name: execute nginx role
      include_role: 
        name: nginx
        tasks_from: main
      tags:
        - nginx
    - name: execute test for nginx role
      include_role: 
        name: nginx
        tasks_from: test
      tags:
        - nginx-test

roles/nginx/test.yml

---
- name: nginxロールのユニットテスト
  block:
    - name: ポート生死の確認
      wait_for:
        port: 80
        msg: 'nginx port is dead'
        timeout: 5
  tags:
    - nginx-test