MoleculeとPodmanを使用したAnsibleロールの開発とテスト

Red Hat Ansible Automation Platformの主な利点の1つは、その自動化言語が2、3の教祖だけでなく、ITに関係するほとんどすべての人が読めることです。したがって、どのスペシャリストも自動化に貢献できます。これにより、チーム間の相互作用の編成と企業文化レベルでの自動化の実装が大幅に容易になります。







ただし、このように多くの人が関与するため、すべてを徹底的にテストすることが非常に重要です。プレイブック、ロール、コレクションなどのAnsibleコンテンツを開発する場合は、本番環境に展開する前に、テスト環境ですべてをテストすることを強くお勧めします。このテストの目的は、「本番」システムでの不快な驚きを回避するために、すべてが正常に機能することを確認することです。



自動化コンテンツのテストは、専用のテストインフラストラクチャを展開し、テスト自体が適切であることを確認するためのテスト条件を設定する必要があるため、注意が必要です。Moleculeは、Ansibleの役割の開発とテストを支援する包括的なテストフレームワークであるため、テストインフラストラクチャの管理に気を取られることなく、自動化の開発に集中できます。



これは、プロジェクトのドキュメントで宣言されている方法です



「Moleculeは、Ansibleの役割の開発とテストを支援するように設計されており、よく書かれ、理解しやすく、維持しやすい、よく書かれた役割をもたらすアプローチを促進します。」


Moleculeを使用すると、複数のターゲットインスタンスで役割をテストして、さまざまなオペレーティングシステムおよび仮想化環境で役割をテストできます。これがないと、これらの組み合わせごとに、個別のテスト環境を作成して維持し、テストインスタンスへの接続を設定して、各テストの前に元の状態にロールバックする必要があります。 Moleculeは、自動化された再現可能な方法で、すべてを実行します。



この2部構成のシリーズでは、Moleculeを使用してAnsibleの役割を開発およびテストする方法を紹介します。最初の部分では、Moleculeのインストールと構成について説明し、2番目の部分では、Moleculeを使用した役割の開発について説明します。



役割がコレクションの一部である場合は、このアプローチを使用して役割を開発し、ユニットテストします。次の記事では、Moleculeを使用してコレクションに対して統合テストを実行する方法を紹介します。



Moleculeはドライバーを使用して、Linuxコンテナー、仮想マシン、クラウドプロバイダーなどのさまざまなテクノロジーにわたってターゲットインスタンスを配信します。デフォルトでは、コンテナ用のDockerとPodman、およびカスタム統合を作成するためのDelegatedドライバーの3つのドライバーがプリインストールされています。他のプロバイダーのドライバーは、プロジェクト開発コミュニティによって提供されます。



この投稿では、Podmanドライバーを使用しますLinuxコンテナを使用して新しい役割を開発およびテストします。 PodmanはLinux用の軽量コンテナエンジンであり、実行中のデーモンを必要とせず、ルートレスコンテナを実行できるため、セキュリティに優れています。



MoleculeとPodmanドライバーを使用して、Apache Webサーバーに基づくWebアプリケーションをデプロイし、Red Hat Enterprise Linux(RHEL)8またはUbuntu20.04で実行する新しいAnsibleロールを最初から開発してテストします。



役割がオペレーティングシステムのさまざまなバージョンで機能する必要がある場合の典型的なシナリオを分析しています。PodmanおよびLinuxコンテナを使用して、複数のインスタンスを作成し、さまざまなOSバージョンで役割をテストできます。コンテナは軽量であるため、開発中にロールの機能をすばやく繰り返すことができます。ロールは実行中のLinuxインスタンスのみを構成するため、コンテナーを使用してロールをテストすることは、この状況に適用できます。他のターゲットシステムまたはクラウドインフラストラクチャでのテストには、委任されたドライバまたは他のコミュニティ提供のドライバを使用できます。



私たちは何が必要なのか



この記事の例では、Python 3とPodmanがインストールされた物理または仮想のLinuxマシンが必要です(RHEL 8.2を使用しています)。Podmanは、ルートレスコンテナを実行するように構成する必要もありました。Podmanのインストールはこの記事の範囲を超えています関連情報については、公式ドキュメントを参照してくださいRHEL 8へのPodmanのインストールについては、RHEL8コンテナのドキュメントでも説明されています



始めましょう



MoleculeはPythonパッケージとして設計されているため、pipを介してインストールされます。最初のステップは、専用のPython環境を作成し、それにMoleculeをインストールすることです。



$ mkdir molecule-blog
$ cd molecule-blog
$ python3 -m venv molecule-venv
$ source molecule-venv/bin/activate
(molecule-venv) $ pip install "molecule[lint]"


Moleculeを「lint」オプションとともにインストールしていることに注意してください。これにより、pipは「yamllint」および「ansible-lint」ツールも提供します。これにより、Moleculeを使用してAnsibleコーディング標準に対して役割コードを静的に解析できます。



インストールでは、Ansibleを含め、必要なすべての依存関係がインターネットからダウンロードされます。次に、インストールしたものを見てみましょう。



$ molecule --version
molecule 3.0.4
   ansible==2.9.10 python==3.6


さて、「分子」コマンドを使用して新しいAnsibleの役割を初期化する時が来ました。



新しいAnsibleの役割を初期化する



一般的に、新しいAnsibleロールを開発する場合、「ansible-galaxy role init」コマンドで初期化されますが、代わりに「molecule」コマンドを使用します。これにより、「ansible-galaxy」コマンドと同じ役割構造と、Moleculeテストを実行するための基本的なコードが得られます。



デフォルトでは、MoleculeはDockerドライバーを使用してテストを実行します。代わりにpodmanを使用するため、「molecule」コマンドでロールを初期化するときは、「-driver-name = podman」オプションを使用して適切なドライバーを指定する必要があります。



「molecule-blog」ディレクトリに戻り、次のコマンドを使用して新しいロール「mywebapp」を初期化します。



$ molecule init role mywebapp --driver-name=podman
--> Initializing new role mywebapp...
Initialized role in /home/ricardo/molecule-blog/mywebapp successfully.


Moleculeは、「mywebapp」フォルダーに役割構造を作成します。このフォルダに切り替えて、そこにあるものを確認してください。



$ cd mywebapp
$ tree
.
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── molecule
│   └── default
│       ├── converge.yml
│       ├── INSTALL.rst
│       ├── molecule.yml
│       └── verify.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml
 
10 directories, 12 files


Moleculeは、構成ファイルを「molecule」サブディレクトリに配置します。新しい役割を初期化するとき、「デフォルト」と呼ばれるスクリプトは1つだけです。後で、ここにスクリプトを追加して、さまざまな条件をテストできます。この記事では、「デフォルト」スクリプトのみを使用します。



ファイル「molecule / default /molecule.yml」の基本構成を確認しましょう。



$ cat molecule/default/molecule.yml 
---
dependency:
  name: galaxy
driver:
  name: podman
platforms:
  - name: instance
    image: docker.io/pycontribs/centos:7
    pre_build_image: true
provisioner:
  name: ansible
verifier:
  name: ansible


リクエストに応じて、このファイルにはPodmanドライバーがテストに使用されることが記載されています。これは、「docker.io/pycontribs/centos:7」コンテナイメージを介してテストインスタンスのデフォルトプラットフォームが設​​定される場所です。これは後で変更します。



Molecule v2とは異なり、Moleculev3はデフォルトのリンターを定義していません。したがって、構成ファイル「molecule / default /molecule.yml」を開いて、最後にlint構成を追加しましょう。



$ vi molecule/default/molecule.yml
...
verifier:
  name: ansible
lint: |
  set -e
  yamllint .
  ansible-lint .


ファイルを保存して閉じ、プロジェクトのルートフォルダから「moleculelint」コマンドを実行して、プロジェクト全体でリンターを実行します。



$ molecule lint


ファイル「meta / main.yml」には必要な値がいくつか含まれていないため、出力にいくつかのエラーが発生します。修正しましょう。「meta / main.yml」ファイルを編集し、「author」、「company」、「license」、「platforms」を追加して、最後の空の行を削除します。簡潔にするために、コメントを省略します。その後、「meta /main.yaml」は次のようになります。



$ vi meta/main.yml
galaxy_info:
  author: Ricardo Gerardi
  description: Mywebapp role deploys a sample web app 
  company: Red Hat 
 
  license: MIT 
 
  min_ansible_version: 2.9
 
  platforms:
  - name: rhel
    versions:
    - 8 
  - name: ubuntu
    versions:
    - 20.04
 
  galaxy_tags: []
 
dependencies: []


プロジェクトでリンターを再度実行し、エラーがないことを確認しましょう。



$ molecule lint
--> Test matrix
    
└── default
    ├── dependency
    └── lint
    
--> Scenario: 'default'
--> Action: 'dependency'
Skipping, missing the requirements file.
Skipping, missing the requirements file.
--> Scenario: 'default'
--> Action: 'lint'
--> Executing: set -e
yamllint .
ansible-lint . 


したがって、私たちの役割は初期化され、分子の基本的な構成も整っています。それでは、テストインスタンスを作成しましょう。



テストインスタンスを作成します



デフォルトでは、Moleculeは「インスタンス」と呼ばれる1つのインスタンスのみを定義し、「Centos:7」イメージから作成されます。私たちの役割は、覚えていれば、RHEL8とUbuntu20.04で機能するはずです。また、Apache Webサーバーをシステムサービスとして実行するため、「systemd」を有効にしたコンテナイメージが必要です。



Red Hatには、「systemd」が有効になっているRHEL 8の公式ユニバーサルベースイメージ があり



ます•registry.access.redhat.com /



ubi8 / ubi-init Ubuntuの公式「systemd」イメージはないため、Jeffが管理するイメージを使用します。 AnsibleコミュニティのGeerling(Jeff Geerling):



•geerlingguy / docker-ubuntu2004-ansible



「systemd」のインスタンスを取得するには、構成ファイル「molecule / default /molecule.yml」を編集して、「centos:7」インスタンスを削除し、2つの新しいインスタンスを追加します。



$ vi molecule/default/molecule.yml
---
dependency:
  name: galaxy
driver:
  name: podman
platforms:
  - name: rhel8
    image: registry.access.redhat.com/ubi8/ubi-init
    tmpfs:
      - /run
      - /tmp
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    capabilities:
      - SYS_ADMIN
    command: "/usr/sbin/init"
    pre_build_image: true
  - name: ubuntu
    image: geerlingguy/docker-ubuntu2004-ansible
    tmpfs:
      - /run
      - /tmp
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    capabilities:
      - SYS_ADMIN
    command: "/lib/systemd/systemd"
    pre_build_image: true
provisioner:
  name: ansible
verifier:
  name: ansible
lint: |
  set -e
  yamllint .
  ansible-lint .


これらのパラメーターを使用して、インスタンスごとに一時ファイルシステム「/ run」と「/ tmp」、およびボリューム「cgroup」をマウントします。さらに、Systemdでコンテナを実行するために必要な「SYS_ADMIN」関数が含まれています。



すべてをスマートに実行し、SELinuxが有効になっているRHEL 8マシンでこの例を実行する場合は、コンテナがSystemdを実行できるように、ブールパラメータ「container_manage_cgroup」もtrueに設定する必要があります(詳細については、RHEL 8のドキュメントを参照してください)。



sudo setsebool -P container_manage_cgroup 1


Moleculeは、AnsiblePlaybookを使用してこれらのインスタンスを初期化します。「molecule / default /molecule.yml」構成ファイルの「provisioner」ディクショナリを変更して、初期化パラメータを変更および追加しましょう。



「ansible.cfg」構成ファイルで指定されているものと同じ構成オプションを受け入れます。たとえば、「デフォルト」セクションを追加して、プロビジョナー構成を更新しましょう。警告を無効にするには、Pythonインタープリターを「auto_silent」に設定します。プロファイラー情報がPlaybook出力に含まれるように、「profile_tasks」、「timer」、および「yaml」コールバックプラグインを含めましょう。最後に、「ssh_connection」セクションを追加し、Podmanでは機能しないためSSHパイプライニングを無効にします。



provisioner:
  name: ansible
  config_options:
    defaults:
      interpreter_python: auto_silent
      callback_whitelist: profile_tasks, timer, yaml
    ssh_connection:
      pipelining: false


このファイルを保存し、ロールのルートディレクトリから「moleculecreate」コマンドを使用してインスタンスを作成しましょう。



$ molecule create


Moleculeはinitプレイブックを実行し、両方のインスタンスを作成します。「分子リスト」コマンドでそれらをチェックしましょう:



$ molecule list
Instance Name    Driver Name    Provisioner Name    Scenario Name    Created    Converged
---------------  -------------  ------------------  ---------------  ---------  -----------
rhel8            podman         ansible             default          true       false
ubuntu           podman         ansible             default          true       false


また、両方のコンテナがPodmanで実行されていることを確認しましょう。



$ podman ps
CONTAINER ID  IMAGE                                                   COMMAND               CREATED             STATUS                 PORTS  NAMES
2e2f14eaa37b  docker.io/geerlingguy/docker-ubuntu2004-ansible:latest  /lib/systemd/syst...  About a minute ago  Up About a minute ago         ubuntu
2ce0a0ea8692  registry.access.redhat.com/ubi8/ubi-init:latest         /usr/sbin/init        About a minute ago  Up About a minute ago         rhel8


ロールを開発するとき、Moleculeは実行中のインスタンスを使用してロールをテストします。テストが失敗した場合、または何らかのエラーによって元に戻せない変更が発生した場合は、すべてを最初からやり直す必要があります。これらのインスタンスは、コマンド「molecule destroy」でいつでも強制終了し、コマンド「moleculecreate」で再作成できます。



結論



せっかちで、役割の開発とテストのトピック、またはAnsible自動化のトピックを深く掘り下げたい場合は、次のリソースをお勧めします。






All Articles