4

私が作成している Ansible ロールでは、インストールとアンインストールの両方のシナリオをカバーしています。

  • foo-install.ymlフラグが に設定されているmain.ymlときから呼び出されます。installtrue
  • foo-uninstall.ymlフラグが に設定されているmain.ymlときから呼び出されます。installfalse

インストールには RPM パッケージのインストール、構成ファイルのコピー、システム サービスの開始が含まれますが、アンインストールの手順は基本的にインストールを逆に行います。つまり、システム サービスを停止し、RPM パッケージをアンインストールし、アプリケーション フォルダーを削除します。

善良な市民として、CentOS Vagrant ボックスでロールを実行するMoleculeを使用してロールのテストを作成しました。これは、Python テスト (を使用testinfra) を使用して、RPM がインストールされていること、サービスが開始されていることなどを検証するインストール シナリオでは問題なく機能します。

Molecule を使用してアンインストール シナリオもテストするにはどうすればよいですか? Moleculeのステップを変更して、このようなことをする方法はありますか(簡略化)?

  • 作成
  • 収束 (役割のインストール部分を実行)
  • 冪等性 (インストール部分用)
  • 検証 (インストール手順)
  • 収束 (役割のアンインストール部分を実行)
  • べき等性 (アンインストール部分用)
  • 検証 (アンインストール手順)
  • 破壊する

たぶん私は何かが欠けているかもしれませんが、このようなことをする方法についての明白な方法 (または例) を見つけていません。

このようなシナリオをカバーする方法はありますか? それとも、インストール シナリオをテストするだけでよいのでしょうか?

4

1 に答える 1

4

推奨ソリューション

これに対処するための推奨される方法は、複数のMolecule Scenariosを使用することです。シナリオをデフォルトとして使用し、アンインストール手順を実行してテストするだけinstallの 2 つ目のシナリオを追加できます。uninstall

これを設定するときは、ロールのmoleculeフォルダーに 2 つ目のシナリオ ディレクトリを作成し (コピーしてdefault)、いくつかの変更を加えます。

  • (編集: このステップは分子 < 3.0 に必要でした。scenario.name後のバージョンでは削除されました)ファイルmolecule.ymlscenario.name属性を にuninstall変更します。

  • 同じファイルで、defaultシナリオのplaybook.ymlファイルをprepareステップのプレイブックとして使用します。

      provisioner:
        name: ansible
        playbooks:
          prepare: ../default/playbook.yml
          converge: playbook.yml
    
  • uninstallシナリオのテストを調整して、アンインストール手順を確認します。

これにより、インストール/デフォルトのシナリオと同じ手順でソフトウェアをインストールできるようになり、アンインストールの手順に集中できます。

シナリオを実行するには、すべてのシナリオまたは 1 つのシナリオを実行できます。

# Run all scenarios
molecule test --all

# Run only the uninstall scenario
molecule test --scenario-name uninstall

これにより、コードを複製することなく、やりたいことにかなり近づけることができます。

他のことを試してみたい場合は、他のいくつかの考えがあります。

代替案

install_uninstall必要なすべてのテスト (リント、冪等性、チェック、検証など) を実行し、特定のシナリオを作成するインストールのみのシナリオを保持します。

再生install_uninstallは決して冪等ではありません。したがって、このシナリオでは、絶対に合格しない冪等性テストを無効にする必要があります。lint など、他のシナリオで実行されるチェック テストを無効にすることもできます。これは、次molecule.ymlのパラメータを調整することで実行できscenario.test_sequenceます。

scenario:
  name: install_uninstall
  test_sequence:
    - destroy
    - create
    - prepare
    - converge
    - verify
    - destroy

もちろん、実際のニーズに合わせて調整できます (この場合の testinfra テストがない場合に verify を削除するなど)。

これが完了したら、シナリオ プレイブックに 2 つのプレイを追加するだけです。

---
- name: install
  hosts: all
  roles:
    - role: my_role
      install: true

- name: uninstall
  hosts: all
  roles:
    - role: my_role
      install: false

そして、次のものでテストする準備ができているはずです:

molecule test -s install_uninstall

編集: 別のオプションは、現在のインストール シナリオのみを保持し、完全なテストではなく、個々の分子コマンドを起動することです。現在の作業シナリオがdefault

# Check and lint my files
molecule lint
# Make sure no box/container is on the way
molecule destroy
# Create my box/container for tests
molecule create
# Play my default playbook
molecule converge
# Idempotency check
molecule idempotence
# Verify we can correctly use check mode
molecule check
# Play testinfra tests
molecule verify
# Now play the uninstall
molecule converge -- -e install=false
## add more tests you can think off ##
# and finally cleanup
molecule destroy.

残念ながら、この機能が最近分子に追加された場合を除き、余分な変数を使用してidempotencyandを呼び出すことはできません。check

于 2019-05-23T16:43:09.480 に答える