TL;DR

  • Ansible Moleculeでのテストの実装はコツがいる

経緯

Ansible MoleculeでAnsibleのroleをテストしたが、結構コツがいるようだったので、メモ。

まず、現時点(2022/9/27)で日本語で言及している記事自体が少ない。以下は参照にさせていただいた。

ポイントは以下。

  • 以下の流れで行う(https://molecule.readthedocs.io/en/latest/getting-started.html#run-test-sequence-commands)
    molecule create (1.Dockerコンテナの生成、起動)
    molecule converge (2.対象ののロールの実行)
    molecule verify (3.テスト)
    molecule destroy
    
    • molecule testで一連の動作をまとめて実行できるとの記載があるが、自分の環境ではverifyがされていないので利用していない
    • 途中でコケたら、molecule loginでコンテナにログインして実際のコマンドを実行するなどして確認する
  • 1.Dockerコンテナの生成、起動
    • molecule.ymlを設定する
      • imageにてDockerコンテナのタグを指定する
      • 例えばubuntu:22.04を指定した場合、python3がインストールされていないためにansibleの各種タスクが実行できずにコケる。また、sudoもインストールされていないため、該当のタスクがbecome: yesを指定しているとやはりコケる。対策としてcommandを指定する。
      platforms:
        - name: instance
          image: ubuntu:22.04
          command: 
            - "apt update"
            - "apt install -y sudo python3"
          pre_build_image: true
      
  • 2.対象ののロールの実行
    • converge.ymlを設定する…が、通常初期値で問題ないはず。他のタスクも実行したい場合は修正が必要なのかも
  • 3.テスト
    • verify.ymlを設定する。
      • assertタグでうまくいけばTrueとなるよう設定する。ファイルの存在をチェックする場合は以下のような感じ
        - name: Register if file exists
          stat:
            path: "/path/to/file"
          register: path_to_file
        - name: Check if file exists
          ansible.builtin.assert:
            that: path_to_file.stat.exists
      
    • ansible_envによる変数はverify時には取得できずにエラーとなる。実際の値を入れておいてやる必要がある。