Molecule入門
Hiroki Uchida
@nikuyoshi
はじめに
本スライドは、2018-12-06に実施されたAnsible Night in Tokyo 2018.12 で公開された資料です。
動作確認バージョンは以下のとおりです。
Ansible 2.7.2
Ansible Galaxy 2.7.2
Molecule 2.19.0
本資料のライセンスは、クリエイティブ・コモンズ・ライセンスのCC-BYです。
https://creativecommons.jp/licenses/
Moleculeについて
Ansible Roleのテストをシナリオベースで実行できる。Driverに対応しているインスタンス(Docker、Vagrant、
AWS、Azure、GCP等)を生成し、シナリオ終了後に削除までしてくれる。
要
件
定
義
コ
ー
デ
ィ
ン
グ
規
約
チ
ェ
ッ
ク
ユ
ニ
ッ
ト
テ
ス
ト
結
合
テ
ス
ト
CIパイプラインで必要なLint、テスト等の作成〜運用を簡単にできることが特
長
設
計
Moleculeによって何が変わるのか
規約チェック
ユニットテスト
結合テスト
システムテスト
工程 Molecule導入後今まで
ansible-lint, yamllint, etc...
Ansible Playbook, Serverspec, TestInfra, etc...
molecule test
それぞれのツールを毎回個別に実行する手間が省ける
Vagrant、Docker、AWS、GCP、Azure, etc...
・
・
・
molecule test のシーケンス
yamllint、flake8、ansible-lintを実行する。lint
destroy
dependency
syntax
create
prepare
converge
idempotence
side-effect
verify
destroy
destroy.yml をもとにVagrant、Docker等のインスタンスを削除する。
ansible-galaxy から依存関係のあるRoleをpullする。
ansible-playbook --syntax-check を実行する。
create.yml をもとにVagrant、Docker等のインスタンスを作成する。
prepare.yml をもとにRole実行時に必要なシステム設定を行う。 ex. Pythonインストール
playbook.yml をもとにRoleを実行する。
冪等性が担保されているかをチェックするためにもう一度Roleを実行する。
HA構成のフェイルオーバー試験等をできる。試験機能。
Testinfraなどで動作後の構成のチェックを行う。
destroy.yml をもとにVagrant、Docker等のインスタンスを削除する。
molecule test 以外のシーケンス
create
create
prepare
destroy
dependency
create
prepare
converge
check
destroy
dependency
create
prepare
converge
destroy
check converge destroy
lint
destroy
dependency
syntax
create
prepare
converge
idempotence
side-effect
verify
destroy
test
Molecule - Configuration - Scenario
Moleculeのコマンドについて
用語の確認
create
create
prepare
destroy
dependency
create
prepare
converge
check
destroy
dependency
create
prepare
converge
destroy
check converge destroy
lint
destroy
dependency
syntax
create
prepare
converge
idempotence
side-effect
verify
destroy
test
コマンド
シーケンス
次の3つを実行する。
● yamllint - Roleディレクトリに存在するすべてのYAMLファイルをyamllintにかける。
lint コマンド
molecule.yml (molecule/test/scenarios/driver/ec2/molecule/default/molecule.yml)
● flake8 - Pythonのソースコード用Lint。Testinfra向けに作られたコードをチェックする。
● ansible-lint - Ansible Playbook用Lint。実行されうるすべてのPlaybookに対してLintがかけられる。
create コマンド、 destroy コマンド
Moleculeが作成したインスタンスを作成、削除する。create, destroyの挙動を変更したい場合は Role名 フォ
ルダ配下に create.yml 、 destroy.yml を配置する。以下の例はVagrantに関するPlaybookだが、公式リポジト
リの molecule/molecule/provisioner/ansible/playbooks を探せばDockerなどのサンプルもある。
prepare コマンド
prepare.yml をもとにRole実行時に必要なシステム設定を行う。ドライバーによって、デフォルトで用意され
るもの(ex. Vagrant)と用意されないもの(ex. Docker)がある。選択したドライバーによってどのような設定フ
ァイルが作成されるかは、molecule/molecule/cookiecutter/scenario/driver/ が参考になる。
以下の prepare.yml はVagrantの場合である。
verify コマンド
molecule.yml で選択したVerifierによって、実行されるテストランナーが異なる。Molecule2系で選択できる
Verifierは、Testinfra(デフォルト)、Goss、Inspec。1系まではServerspecが選択できていた。LintはFlake8(デ
フォルト)、RuboCopを選択できる。設定項目の詳細は公式ドキュメントのConfiguration > Verifierを参照する
こと。それぞれのVerifierでどのような設定ファイルが生成されるかは
molecule/molecule/cookiecutter/scenario/verifier/ を参照すること。
その他のコマンド ※molecule --helpで確認できます
コマンド サブコマンド 説明
molecule init role AnsibleのRoleを生成する。
scenario Moleculeのテストシナリオを作成する。
template URLからRoleを作成する。
molecule list - Moleculeで作成したインスタンスのステータス
を確認する。
molecule matrix check, converge, create, dependency,
destroy, idempotence, lint, prepare,
side-effect, syntax, test, verify
指定したサブコマンドが何のシナリオを実行す
るかチェックする。
molecule login - Moleculeで作成したインスタンスにログインす
る。
このスライドまでで紹介されていないコマンドを以下に記載する。
init コマンド(1/2)
molecule init - role、scenario、templateの作成
● molecule init role
○ AnsibleのRoleを作成する。 -d でドライバーを設定しないとDockerが選択される。また、 ansible-
galaxy コマンドで生成されるディレクトリ構成と異なる。
molecule init role -r apache -d vagrant ansible-galaxy init --init-path=. apache
参考: wata さんのAnsible Galaxyのスケルトン
init コマンド(2/2)
● molecule init scenario
○ Moleculeのテストシナリオを作成する。Roleディレクトリ直下で実行しないと失敗するため注意。
molecule test も同様。また、 ansible-galaxy で作成されたRoleに対して初めてシナリオを追加す
る場合は、シナリオ名をdefaultにしないと作成に失敗する。
● molecule init template - URLからRoleを作成する
○ ex. molecule init template --url https://example.com/user/cookiecutter-repo
list コマンド, matrix コマンド
molecule list - Moleculeで作成したインスタンスのステータスを確認する。
molecule matrix - 指定したサブコマンドが何のシナリオを実行するかチェックする。
login コマンド
molecule login - Moleculeで作成したインスタンスにログインする。
Moleculeのインストールについて
公式ドキュメントをもとに、インストールを行う。
参考: Pythonの仮想環境構築 2017.01版
$ mkdir ansible-night-2018-12
$ cd ansible-night-2018-12
$ python3 -m venv .venv
$ source .venv/bin/activate
$ pip install molecule
Molecule利用時のフローチャート
Role作成済み
cd Roleディレクトリ
molecule init scenario -r Role名 -s default
molecule init role -r Role名 -d ドライバ名
Role修正、シナリオ修正
はい
いいえ
実行したいものは
molecule test --all
シナリオ全実行
(結合テスト、シナリオテスト)
molecule test -s シナリオ名
指定シナリオの実行
molecule create
Roleを実行して動作後のチェック
(ユニットテスト)
molecule converge
molecule verify
molecule destroy
molecule lint
規約チェック
良い点、懸念点
● 良い点
○ AnsibleのRoleをテストしたい時に、必要なファイル一式をサクッと作成できるようになる。
○ Lint, テストを実行するのに、Moleculeから一律操作ができるようになり操作がシンプルになる。
○ 公式のAnsibleプロジェクトに追加されたため、Red Hatが公式にサポートしている。
● 懸念点
○ Serverspecから移行する際に、Testinfra、InSpec、Gossのどれかに書き換える必要がある。
■ 実際に移行コストはかなり高いという声あり。
● Serverspecのリソースタイプ vs TestInfraのModule
■ InSpecへ乗り換えればMoleculeで利用できる。マイグレーションガイド
■ Molecule 1系はServersecが使えたため、あえて1系を使うのも手。サンプルは、wateさんの
ansible-role-mariadbを参考のこと。 ちなみに、2系はServerspecに対応しないとのこと。
● 1系から2系へのコンバートスクリプトがある。
○ molecule test に-vオプションがない。デバッグをどうするのか知りたい。
■ Pipfile 内の scripts に、 --debug をつければ確認できるらしい。
[scripts]
(...)
test = "molecule --debug test"
(...)
困ったことがあれば、ansiblejpのSlack部屋に相談すれば、きっとガチ勢が答えてくれるはず!
http://bit.ly/slack-ansiblejp
時間があればデモをします
謝辞
レビュアーとしてコメントいただきありがとうございます!!
● lu_iskun さん
● wate さん
● curry9999 さん
参考
● Molecule公式ドキュメント Version 2.19
● Molecule公式ドキュメント Version 1.25
● Moleculeリポジトリ
● How To Test Ansible Roles with Molecule on Ubuntu 16.04
● Infrastructure Testing with Molecule

Molecule入門