ansible role のテストに Molecule を導入してみました。
Molecule とは、ansible role の開発やテストを支援するツールです。
これまで Linter として ansible-lint
、テストとして Serverspec
などを使用していたものを、Moleculeだけで管理することができます。
すでに作成済みの role にも簡単に導入できるため、先日以下の role に Molecule を導入しました。GitHub Actions で Molecule が動作するようになっております。 (こちらは Mac 開発環境を setup するために作成した role です)
こちらを参考に Molecule の導入方法をご紹介します。
インストールに必要な前提条件は以下の通りです。
私は仮想環境 (venv) を使用しているので、以下のように仮想環境を有効化した状態で進めていきます。
python3 -m venv .venv
. .venv/bin/activate
pip install -U pip
ansible 同様、molecule も Python で書かれているため、pip より install ができます。
以下のコマンドを実行してmoleculeをインストールします。
pip install "molecule[ansible,docker,lint]"
この時、molecule[ansible,docker,lint]
と引数を指定することで、必要な関連パッケージもインストールできます。
今回使用した 3 つの引数は以下になります。
インストールされたパッケージは以下のようになりました。 ansible-lint
や yamllint
、 docker
など、上記で指定したパッケージも入っていることが確認できます。
$ molecule --version
molecule 3.4.0 using python 3.9
ansible:2.11.3
delegated:3.4.0 from molecule
docker:0.2.4 from molecule_docker
$ pip freeze
ansible==4.4.0
ansible-core==2.11.3
ansible-lint==5.1.2
arrow==1.1.1
backports.entry-points-selectable==1.1.0
bcrypt==3.2.0
binaryornot==0.4.4
bracex==2.1.1
Cerberus==1.3.2
certifi==2021.5.30
cffi==1.14.6
cfgv==3.3.0
chardet==4.0.0
charset-normalizer==2.0.4
click==8.0.1
click-help-colors==0.9.1
colorama==0.4.4
commonmark==0.9.1
cookiecutter==1.7.3
cryptography==3.4.7
distlib==0.3.2
docker==5.0.0
enrich==1.2.6
filelock==3.0.12
flake8==3.9.2
identify==2.2.13
idna==3.2
Jinja2==3.0.1
jinja2-time==0.2.0
MarkupSafe==2.0.1
mccabe==0.6.1
molecule==3.4.0
molecule-docker==0.2.4
nodeenv==1.6.0
packaging==21.0
paramiko==2.7.2
pathspec==0.9.0
platformdirs==2.2.0
pluggy==0.13.1
poyo==0.5.0
pre-commit==2.14.0
pycodestyle==2.7.0
pycparser==2.20
pyflakes==2.3.1
Pygments==2.9.0
PyNaCl==1.4.0
pyparsing==2.4.7
python-dateutil==2.8.2
python-slugify==5.0.2
PyYAML==5.4.1
requests==2.26.0
resolvelib==0.5.4
rich==10.7.0
ruamel.yaml==0.17.10
ruamel.yaml.clib==0.2.6
six==1.16.0
subprocess-tee==0.3.2
tenacity==8.0.1
text-unidecode==1.3
toml==0.10.2
urllib3==1.26.6
virtualenv==20.7.2
wcmatch==8.2
websocket-client==1.2.1
yamllint==1.26.2
これまでは、新たに ansible role を作成するときは、ansible-galaxy
コマンドを実行していましたが、molecule を含む role を作成する場合は以下のコマンドを実行します。
molecule init role roles/my-role
すると、以下のように molecule を含む role が作成されます。現在のバージョンだと、デフォルトで 5 つの yml が作成されていました。
$ tree roles/my-role/
roles/my-role/
├── README.md
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── molecule
│ └── default
│ ├── INSTALL.rst
│ ├── converge.yml
│ ├── create.yml
│ ├── destroy.yml
│ ├── molecule.yml
│ └── verify.yml
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
10 directories, 14 files
また、既に作成してある role に Molecule を入れたいときは、そのディレクトリに移動して molecule init scenario -r <role名>
を実行します。
cd roles/my-role
molecule init scenario -r my-role
すると、molecule/default
ディレクトリとデフォルトの yml ファイルが作成されます。(こちらは1 つの yml が生成されました。)
$ tree molecule/
molecule/
└── default
└── molecure.yml
1 directory, 1 files
以上で Molecule に必要なファイルの準備はできました。
次回は Molecule ファイルの設定方法と CLI についてご紹介します。