moleculeとvCenter Simulatorを連携したテストをする


本記事は Ansible Advent Calendar 2021, Ansible Advent Calendar 2021 – Qiita, vExperts Advent Calendar 2021の15日目の記事になります。

VMware関連のAnsibleネタでまたお前かと思われる方もいるかもしれませんが、しばしお付き合いください。

AnsibleにはPlaybookやRoleをテストするツールがいくつかOSSで提供されています。
その中で molecule というテストツールはRoleのテストをするツールとして開発・提供されています。

moleucleを使用することで、ざっくりな説明になりますが以下の項目を自動的に実行してくれます。

  • テスト環境の構築、テストを実行する前の事前作業
  • 構築したテスト環境を使用してRoleのテストを実行
  • べき統制のテスト
  • Role実行後に想定した状態になっているかどうかの確認
  • テスト環境の破棄

moleculeでテスト環境を自動で構築するには、環境を構築するためのドライバが必要です。
ドライバには vagrant azure aws docker などが準備されています。
もちろん vmware もあります 🙂
詳細は以下で確認してみてください。

そこで、今回はmoleculeとvCenter Simulator(vcsim)を使ってコンテナ環境でVMwareのRoleをテストしてみようと思います。

環境情報

項目 バージョン 備考
OS RHEL 8.4
python 3.9.6
docker-ce 20.10.12
ansible-core 2.12.1
molecule 3.5.2
community.vmware 1.17.0 VMwareコレクション
community.docker 2.0.2 Dockerコレクション

環境の準備

Dockerのインストール

今回はコンテナエンジンとしてDockerを使用します。
以下の手順でインストールしてください。

dockerのインストール完了後に起動します。

Pythonのインストール

Python 3.9をインストールします。

Python 3.9用のSELinuxのパッケージをインストールします。
※標準でインストールされているpython3-libselinuxパッケージはPython 3.6用のものです

Ansibleのインストール

venvを作成してAnsibleをインストールします。

VMwareコレクションのインストール

VMwareのモジュールを使用するためVMwareコレクションのインストールおよび動作に必要なライブラリをインストールします。

Dockerコレクションのインストール

vcsimコンテナをデプロイするためにDockerコレクションをインストールします。

moleculeのインストール

moleculeとdockerドライバをインストールします。

これで準備が整いました 🙂

テスト準備

テスト用Roleの作成

ここではテスト用として example Roleを作成してみます。

上記のタスクはVMの情報を取得してdebugで表示するだけの処理を実行する簡単なものになっています。

moleculeのシナリオ作成

moleculeはテストシナリオを作成して、そのシナリオごとに定義されたテスト内容を実行します。
ここでは defualt のシナリオを作成します。

シナリオを作成すると以下のファイルが生成されます。

ファイル名 説明
INSTALL.rst テストシナリオの説明や仕様などを書くrstドキュメント
molecule.yml moleculeの設定をするファイル
create.yml テストインスタンスを作成するタスクが定義されたファイル
destroy.yml テストインスタンスを削除するタスクが定義されたファイル
converge.yml 実行するRoleが記述されているファイル
verify.yml convergeを実行した後に想定した状態になっているかを確認するタスクが定義されたファイル(今回は使わない)

作成されるファイルの内容はドライバによって変わりますが、ここでは標準の delegated ドライバを使用したものを前提に進めます。
delegated ドライバを使用することでテスト用インスタンスの作成・破棄を自由に定義できます。
例えば、テストで使用したい環境のドライバが存在しない場合でもユーザーがインスタンスを作成・破棄するタスクを書くことで対応することができます。

molecule.ymlの修正

moleculeの設定を以下のようにします。

platforms は作成するインスタンス情報を記述します。
ここでは vcsim という名前でテスト用インスタンスのホスト名を定義します。
その他の設定の詳細については以下を参照ください。

create.ymlの修正

テスト用インスタンスを作成するタスクを追加します。

install dependency roleタスクについて

vcsimをセットアップするためのRoleを作成しましたので、こちらを使うようにRoleをインストールしています。

setup vcsim

上記のRoleを実行しています。

populate instance config dict

こちらには、作成したテスト用インスタンスの情報を記述します。
この情報を基にmoleculeはテストインスタンスへの接続用のinventory情報を生成します。
設定可能なパラメーターに関しては以下を参照ください。

そして convert instance config dict to a listdump instance config タスクを実行してinventoryファイルを生成します。

destroy.ymlの修正

テスト用インスタンスを破棄するタスクを追加します。

vcsimをセットアップするRoleを使うと vcsim という名前でコンテナが作成されます。
そのため vcsim が存在している場合はコンテナが削除されます。
また、最後にvcsimセットアップRoleは不要のため削除しています。

converge.ymlの修正

Roleはmoleculeのホストで動作させるため connectoin: local を追加します。
また、Role内で使うvCenterのホスト名の変数は vcenter_hostname のため ansible_host(インベントリに記述したホスト名が格納されるマジック変数) の値をその変数に格納します。

テスト用パラメーターの追加

テストで使用する host_vars group_vars を追加します。
まずは group_vars にvcsimの認証情報を記述します。

上記のユーザー名、パスワードがvcsimのデフォルトになります。
次に host_vars を追加します。
ファイル名は molecule.yml に記述した platforms で指定した名前で作ります。

vcsimのRoleでシミュレーション環境を構築すると標準で以下の構成が作成されます。
一部の見方を書いておきます。

テスト実行

moleculeのdefaultシナリオを実行します。

asciicast

こんな感じでRoleのテストができます 🙂

最後に

vscimを使用する時の注意点ですが、VCSAで出来る操作が全てサポートされているわけではありません。
そのため、vcsimで出来ないテストはVCSAを作って代用するなど代替案を考える必要がありますが、vcsimで出来る範囲であればコンテナ上でサクッとテストができます 🙂

Happy Automation!

Leave a Reply

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください