MoleculeでAnsibleのRoleをテストする - その2
こんにちは。株式会社SHIFT、自動化エンジニアの水谷です。前回に続いてAnsibleのRoleをテストするツール"Molecule"についてのお話しです。今回は、MoleculeでLintの実行と、Roleの実行結果のテスト、それから一連のテストを自動実行する方法について、という内容です。
MoleculeでLintを実行してみる
まずは、Lintを実行するための設定をしてみます。実行するLintは、YAMLの規則に沿ってRoleが記述されていることを確認する"yamllint"と、PlaybookやRoleの問題点を見つけたり、ベストプラクティスに沿っていない箇所を見つけてくれる"Ansible Lint"の2つです。
これらを実行するには、molecule/default/molecule.ymlに以下の行を追加します。
lint: |
set -e
yamllint .
ansible-lint .
2行目の"set -e"は、エラーがあれば実行を停止するためのコマンドで、なくても良いような気もしましたが、Moluculeのオフィシャルページでこの行が記述されていましたので、それに従っています。また、Lintを実行する対象は、いずれも"."としていますので、Role内全体のYAMLファイルとなります。
molecule.yml全体としては下のようになります。
---
dependency:
name: galaxy
lint: |
set -e
yamllint .
ansible-lint .
driver:
name: docker
platforms:
- name: instance
image: ubuntu:18.04
provisioner:
name: ansible
verifier:
name: ansible
※前回の記事では、"platforms:"のところで、apt updateを実行するように書いていましたが、うまく動かない場合があったので、Roleのタスク内のaptモジュールで、"update_cache: yes"とするように変更しました。
なお、yamllintとAnsible Lintはあらかじめ以下のようにpip(pip3)でインストールしておく必要があります。
$ pip3 install yamllint
$ pip3 install ansible-lint
これで、moleculeを"lint"オプションで実行すると、Lintが実行されます。
どうやら、yamllintではエラーが検出されず、Ansible Lintでエラーが4つ見つかっているようです。
これらのエラーは、MoleculeでRoleを作った際に生成されたmeta/main.ymlにデフォルトで入っている企業名などが、そのまま変更されていないことに対するものでした。"author"、"description"、"company"にダミー文字列が入っているので、これを変更するのと、"platforms"のところを適当に記述すればエラーがなくなります。
Roleのテスト
さて、次にRoleのテストを追加してみましょう。
Moleculeにおいて、Roleのテストはテスト用のPlaybookを実行して行うか、TestinfraというPython製インフラテストツールで行います。ここではPlaybookでテストを行いたいと思います。
テストに使用するPlaybookは、/molecule/defaults/verify.ymlです。"molecule init"でRoleを作成した際にすでにこのファイルが作られていて、ダミーのテストが記述されています。
このファイルを以下のように書き換えて、commandモジュールでApacheのサービスが動作しているかどうかをチェック("service apache2 status"を実行してそのリターンメッセージが" * apache2 is running"であることを確認)するコードを書いてみました。
---
- name: Verify
hosts: all
gather_facts: false
tasks:
- name: Get Apache service status
command: "service apache2 status"
register: apache_status
- name: Check if Apache is running
assert:
that: apache_status.stdout == " * apache2 is running"
fail_msg: "Apache is not running"
success_msg: "Apache is running"
ではさっそく、"verify"オプションでMoleculeを実行してみましょう(molecule convergeで既にRoleが実行済みという想定です)。
$ molecule verify
このように、apache2サービスのステータスを取得して、それが実行中であることが確認できました。
一連のテストの一括実行
さて、LintとRoleテスト用Playbookの実行が確認できたところで、Moleculeの"test"オプションを実行してみましょう。これは、Lintの実行、Dockerでテスト環境の作成、Docker内でPlaybookの実行、再度Playbookを実行して冪等性の確認、テスト用Playbook(先程のverify.yml)の実行、そしてDockerでのテスト環境の廃棄までを一気に実行してくれるものです。
一旦"molecule destroy"を実行して、今のテスト環境を廃棄して、"molecule test"を実行してみましょう。
$ molecule test
結果は以下のようになりました(うまく貼り合わせられず、ちょっとずれていますが……)。
ちょっと長いですが、どうやらうまく一連のテストが実行できたようですので、これでMoleculeを使ってRoleのテストが自動化できたことになります。あとは、verify.ymlをしっかり充実させて、これをCIに設定すればRoleの作成もはかどりますね。
まとめ
Moleculeは、Roleをテストするのは十分にパワフルで柔軟性があることがわかりました。そして、これからAnsibleを使って"きっちり"何かを自動化しようとする際には、MoleculeでRoleを作り、十分なテストを作りこみ、CIを設定してしっかり作りこんでいくのが良いと感じました。
ただし、Windowsをターゲットとする場合は、まだ不明な点が多いです。(AnsibleやMoleculeはLinux系OSで動作するため)Dockerではダメなので、テスト実行プラットフォームをAWSなどでDelegeteするか、VMWareなどを使うなどの手段が必要なようです。このあたりで良い方法がわかりましたら、また記事を書いてみたいと思います。
――――――――――――――――――――――――――――――――――
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/