はじめに
AAP(Ansible Automation Platform)や ansible-navigator(のデフォルト)では、コンテナ内で Playbook を実行する仕組みになっています。
この Playbook を実行するためのコンテナ環境のことを、実行環境(EE: Execution Environment)と呼びます。EE に含める ansible-core のバージョンにするか、どのコレクションのどのバージョンを入れるかなどを考える必要があります。
もう一つの考慮点としては、どういう単位で EE とまとめるか、という点もあります。
開発や運用の体制、自動化対象の種別などによって、分け方がいろいろあるかもしれません。あまり絶対的な正解がない類の話であり、「ケースバイケース」と一言で言ってしまえばそれまでです。
しかし「一つまとめる必要がある場合」や、逆に「分ける必要がある場合」もあります。私が思いつく範囲ですが、それぞれどういう時なのかを簡単にまとめます。
一つまとめる必要がある場合
EE を一つにまとめる必要がある場合についてです。
ジョブテンプレート内の処理に対応できるようにまとめる
仕様上、AAP の1つのジョブテンプレートに対して、EEは1つのみ割り当てる関係です。1つのジョブテンプレートに2つ以上の EE を割り当てることはできません(AnsibleがどちらのEEを使えばいいか分からなくなってしまう)。
そのため、そのジョブテンプレートを実行するためのあれこれ(コレクション、Pythonライブラリ、Systemパッケージなど)を1つのEEにまとめる必要があります。
たとえば、1つのジョブテンプレートのなかで、Cisco IOS 機器向けの処理とAzure 向けの処理がある場合は、それぞれの処理に必要なもの(この場合 cisco.ios コレクション、azure.azcollection コレクション、依存パッケージ)を入れた EE にしておく必要があります。
もし、「そもそも ジョブテンプレート分けちゃった方がいいね」となったらまとめる必要はなくなります(どちらでもよくなる)。
分ける必要がある場合
EE を分ける必要がある場合についてです。
ansible-core のバージョンを分ける
「ジョブテンプレートAは ansible-core 2.18 系、ジョブテンプレートBは ansible-core 2.16 系で実行する」のような場合は、利用する ansible-core のバージョンを分ける場合は、EE を分ける必要があります。
たとえば、RHEL 9 向けのジョブテンプレート、RHEL 8 向けのジョブテンプレートがあって、基本的には新しめの ansible-core を使いたい、という場合です。
現状、AAP のライフサイクルのページでは、ansible-core 2.18 では「Supported Managed OS (RHEL)」が RHEL 9 – 10 となっており、RHEL 8が含まれていません。RHEL 8 が含まれているのは ansible-core 2.16 までです。このような経緯で、RHEL 9 向けには ansible-core 2.18、RHEL 8 向けには ansible-core 2.16 を使いたい場合は EE を分ける必要があります。
ただし、Playbook は必ずしも別にする必要はありません。例えば、各OS に対して ansible.builtin.dnf モジュールを使った同じ処理をするのであれば共通の Playbook を用意したうえで、以下のような組み合わせでジョブテンプレートを作る方法があります(名称はすべて例です)。
| 対象 | ジョブテンプレート | EE | Playbook |
|---|---|---|---|
| RHEL 8 | update_rhel8 |
ee-rhel8 |
rhel_update.yml(共通) |
| RHEL 9 | update_rhel9 |
ee-rhel9 |
rhel_update.yml (共通) |
なお、ansible-core のバージョンによって、サポートしている Python のバージョンの範囲が決まっています。少なくとも AAP 標準の EE であれば正しい組み合わせになっているはずですが、他をベースイメージに利用しているなどの場合は気にする必要があります。組み合わせは「ansible-core support matrix」の表で分かります。
コレクションのバージョンを分ける
前述の ansible-core のバージョンを分ける場合と似ていますが、コレクションのバージョンを使い分ける場合も EE を分ける必要があります。
たとえば、しばらく前の話ですが、ネットワーク機器向けの共通コレクションである ansible.netcommon コレクションはどこかのバージョン(確か 5.0.0)で破壊的な変更があり、cisco.ios などの OS 別コレクションのバージョンとの組み合わせを強く意識する必要がありました。このような場合は、この組み合わせの EE、この組み合わせの EE・・と分ける必要があります。
依存性の問題で分ける
ちょっと記憶があやふやなのですが、とあるコレクションが多くの Python パッケージを必要としていて、ほかのコレクションと依存性の関係で相性が良くない、という話を聞いたことがあります(自分がそういったのかさえあやふや・・)。
具体的にどういうコレクションの組み合わせかというのは指し示せませんが、ない話ではないと思います。どうにもこうにもできない場合は EEを分ける必要があります。
おわりに
EEを1つにまとめる必要がある場合と、分ける必要がある場合についてまとめました。
今回は仕様上「必要がある」という温度感での話でしたが、運用管理面で「~したほうがよい」という見方の話もあるかなと思います。