レッドハットの杉村です。Ansible のテクニカルサポートをしています。毎月1つは何か書くことを目標にしています。
今月は execution environments について紹介します。
Ansible は Python で書かれており、Python の実行環境を作ってライブラリやモジュールの依存関係を閉じ込めて実行するようになっています。
旧 Ansible Tower では virtual environment の仕組みを使っていました。以前記事を書きましたのでご覧ください。
Ansible automation controller (旧称 Ansible Tower) では、virtual environment は controller の Web UI やサービスなどを動作するためだけに使われるようになり、ansible-playbook などのコマンドは execution environments という別な仕組みを使うようになりました。
execution environments はこのような特徴を備えています。
- Red Hat Enterprise Linux UBI 8 をベースとするコンテナイメージ
- Ansible 2.9 もしくは Ansible Core 2.11 を動作させることができる
- Python 3.8
- Collections をあらかじめインストールする
- Python の依存ライブラリや動作に必要な設定ファイルなどもあらかじめインストールできる
実行環境がコンテナとしてまとめられたことにより、Podman のコンテナとして扱えるようになります。イメージ配布の仕組みも新しく Automation Hub に取り入れられ、クラスタとして複数台の controller を使う場合でも、それぞれに virtual environment を作らなくてもよくなっています。
execution environments の作り方
Ansible Automation Platform 2.0.x をインストールしますと、いくつかの execution environments が初期インストールされます。
- ansible-automation-platform-20-early-access/ee-supported-rhel8
- ansible-automation-platform-20-early-access/ee-minimal-rhel8
こちらの Container images のサイトから検索して見つけることもできますが、単独で取って来て利用いただくことはお勧めしません。
以前 virtual environment で利用されていたように自分でカスタマイズして使いたいときには、ansible-builder が用意されています。英語ではありますがこちらにドキュメントを書きましたので、弊社のアカウントがある方はご覧ください。
例えばコミュニティで開発されているコレクションを使いたいときには必要になると思います。プロジェクトの中で collections/requirements.yml を置くことで、プロジェクトを同期するときにコレクションも動的にダウンロードしてくるという機能があることは先月解説しましたが、そのコレクションが Python のモジュールに依存していて追加で実行環境にインストールしておかなければいけないときには、この requirements.yml では対応できないという問題がありました。
他にも上のドキュメントの例にも書きましたが、Windows を操作するために Kerberos 認証が必要となって /etc/krb5.conf の設定や暗号化周りの設定をカスタマイズしなければいけない場合には、やはり execution environments を作っていただくことになります。
execution environments の使い方
controller の Web UI からは、「実行環境」に登録すればプロジェクトやジョブテンプレート、インベントリー同期などで使えます。
コマンドラインからは、ansible-navigator を通して使うことができます。ansible-builder と同様に、ansible-automation-platform-2.0-early-access-for-rhel-8-x86_64-rpms のリポジトリから dnf でインストールできます。
# dnf install ansible-navigator
controller 上で起動させる場合には、awx ユーザでお使いいただくと便利です。たとえばわたしの環境ではこのようにイメージがあります。
# su - awx $ podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/ee-supported-rc4-with-collections latest 6b024619c7ea 13 days ago 1.24 GB localhost/latest_aws_collection_execution_environment_minimal latest 808626f78226 2 weeks ago 400 MB registry.redhat.io/ansible-automation-platform-20-early-access/ee-supported-rhel8 2.0.0 85ca2003a842 2 months ago 920 MB registry.redhat.io/ansible-automation-platform-20-early-access/ee-minimal-rhel8 2.0.0 078c7d4aca51 2 months ago 288 MB registry.redhat.io/ansible-automation-platform-20-early-access/ansible-builder-rhel8 2.0.0 df5d9fdcdbd4 2 months ago 359 MB
ansible-navigator からも見ることができます。ansible-navigator images コマンドを実行すると、昔を思い出すようなキャラクタベースのアプリケーションが起動します。数字を押していろいろたどってみてください。
もちろん Ansible のコマンドを実行することもできます。inventory と playbook.yml を用意して、ee を指定して起動した例です。
$ ansible-navigator run playbook.yml -i inventory --eei registry.redhat.io/ansible-automation-platform-20-early-access/ee-supported-rhel8:2.0.0
全体の実行結果が表示されて、数字を押すことで中を掘って見ていくことができます。
従来のような出力で実行させることもできます。
$ ansible-navigator run playbook.yml -i inventory --eei registry.redhat.io/ansible-automation-platform-20-early-access/ee-supported-rhel8:2.0.0 -m stdout PLAY [servers] ***************************************************************** TASK [Gathering Facts] ********************************************************* ok: [192.168.0.100] ok: [192.168.0.101] ok: [192.168.0.102] TASK [ping] ******************************************************************** ok: [192.168.0.102] ok: [192.168.0.101] ok: [192.168.0.100] PLAY RECAP ********************************************************************* 192.168.0.100 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 192.168.0.101 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 192.168.0.102 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 $
プレイブックを実行するだけだとあまり便利になったような気はしませんが、他にもいろいろと機能はありますので、ご興味ありましたらお手元でも動かしてみてください。ドキュメントはこちらです。
おまけ
実際には podman コマンドから実行してしまうこともよくあります。
$ podman run -it registry.redhat.io/ansible-automation-platform-20-early-access/ee-supported-rhel8:2.0.0 ansible --version ansible [core 2.11.2] config file = /etc/ansible/ansible.cfg configured module search path = ['/home/runner/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.8/site-packages/ansible ansible collection location = /home/runner/.ansible/collections:/usr/share/ansible/collections executable location = /usr/bin/ansible python version = 3.8.6 (default, Jan 22 2021, 11:41:28) [GCC 8.4.1 20200928 (Red Hat 8.4.1-1)] jinja version = 2.10.3 libyaml = True $ podman run -it registry.redhat.io/ansible-automation-platform-20-early-access/ee-supported-rhel8:2.0.0 ansible-galaxy collection list # /usr/share/ansible/collections/ansible_collections Collection Version ------------------------ ------- amazon.aws 1.5.0 ansible.controller 4.0.0 ansible.netcommon 2.2.0 ansible.network 1.0.1 ...
外からファイルを与えないといけない場合にはコンテナの性質上そのままでは動作しませんので、ansible-navigator コマンドを使うこともあります。controller の Web UI からプロジェクトやジョブテンプレートを作って実行するのが一番楽だとは思います。
おわりに
Ansible Automation Platform 2.0 で導入された実行環境 (execution environments) について紹介してみました。
コンテナの扱いはもういまとなっては常識になってきているところがあると思いますし、広く普及したコンテナの知識を Ansible Automation Platform でもご利用いただけるのはとても大きいと思います。
Ansible Automation Platform は Developer Subscription でもお試しいただけますので、ご興味持たれましたら試してみてください。
Happy Automation!