[Ansible/AAP] AAP 2.5 のインストールでエラー "c{'gateway_proxy_url': 'https://hoge:443 is not a valid URL'}" が発生する原因と対処 (original) (raw)
はじめに
AAP 2.5 のインストール Playbook を実行した時、以下のようなエラーの遭遇したことがありました。
"c{'gateway_proxy_url': 'https://aap25c:443 is not a valid URL'}"}
インストールドキュメント通り、指定したインベントリホスト名は名前解決できる状態にしてあるのに、なんでだろう、他に要件あるのかな?と結構悩みました。
調べて分かった原因と対処についてまとめます。
はじめに簡単にまとめておきますと、ホスト名を指定する場合、aap25c
のような単一ラベルではなく aap25c.sakana.test
のようにドメインを含む形のインベントリホスト名を指定する必要がありました。
前提環境
- インストーラー: Ansible Automation Platform 2.5 Containerized Setup Bundle
- ansible-automation-platform-containerized-setup-bundle-2.5-2-x86_64.tar.gz 最終更新日 2024-10-08
現象
インストール時には以下のようなインベントリファイルを利用しました。
[automationgateway] aap25c ansible_connection=local
略
発生したエラーは以下の通りです。
TASK [ansible.gateway_configuration.settings : Update automation platform gateway Settings] ************************************************************** fatal: [aap25c]: FAILED! => {"changed": false, "msg": "c{'gateway_proxy_url': 'https://aap25c:443 is not a valid URL'}"}
このタスクは、インストーラーに同梱されている ansible.gateway_configuration.settings
ロール内の、ansible.gateway_configuration.settings
モジュールを利用したタスクです。
- name: Update automation platform gateway Settings ansible.gateway_configuration.settings: settings: "{{ gateway_settings | default(omit, true) }}"
これは、Platform Gateway への各種設定をタスクで、設定内容(settings
オプション)として、gateway_settings
が渡されます。この gateway_settings
は以下のような形式になります。
gateway_settings: gateway_proxy_url: aap25c
上記の内容が Platform Gateway の設定変更 API リクエストの body に添えられます。レスポンスとしてエラー {'gateway_proxy_url': 'https://aap25c:443 is not a valid URL'}
が返ってきます。
インストーラー自身がエラーを返しているというよりは、API からのエラーが Playbook 実行結果のエラーとして表示されている形です。
なお、この現象は、Platform Gateway の GUI の [設定] > [Platform gateway] 画面 の Gateway proxy url
欄への記入でも再現できます。
Gateway proxy url の指定エラー
原因
Platform Gateway 側の処理を追っていったところ、gateway_proxy_url
に対して、バリデーションしてる箇所があってここでエラーが発生したようです。
机上で追っただけですが、バリデーションを定義している箇所は、コンテナ automation-gateway
の /usr/lib/python3.11/site-packages/aap_gateway_api/preferences/types.py
の validate
メソッドのようでした。
バリデーションは Django の django.core.validators
の URLValidator クラスによるものでした。コードはこちら。
(バージョンは rpm -qa | grep django
の結果の python3.11-django-4.2.16-1.el8ap.noarch
で判断しました)
色々と正規表現が定義されていますが、今回の一番のポイントは以下の箇所かなと思います。
hostname_re = (
r"[a-z" + ul + r"0-9](?:[a-z" + ul + r"0-9-]{0,61}[a-z" + ul + r"0-9])?"
)
domain_re = r"(?:\.(?!-)[a-z" + ul + r"0-9-]{1,63}(?<!-))*"
tld_re = (
r"\."
r"(?!-)"
r"(?:[a-z" + ul + "-]{2,63}"
r"|xn--[a-z0-9]{1,59})"
r"(?<!-)"
r"\.?"
)
host_re = "(" + hostname_re + domain_re + tld_re + "|localhost)"```
ホスト名のパターンとしては、上記規則に基づいたドメイン名を含むか、localhost
が OK とされています。これに対して、今回指定したのは aap25c
という単一ラベルのホスト名だったのでエラーとなった、という話です。
ホスト名のパターンで OK と NG パターンの例を以下にまとめます。
なお、URLValidator
クラスには、他にも IPv4、IPv6 アドレスも OK とする正規表現も指定されていました。他、別途 http://
や https://
等のスキームや :443
等のポート番号などのパターンもありました。
対処
インベントリファイルで指定するインベントリホスト名を、バリデーションがOKとなる形式に修正して再度インストールします。
例:
[automationgateway] aap25c.sakana.test ansible_connection=local
略
もし今回のエラーが解消して、別の解せないエラーが発生した場合は、一度アンインストールしてから再度インストールするとうまくいくことがあります。
おわりに
何をもとにして valid か not valid か判定しているのかわかってスッキリしました。
最初はエラーメッセージをインストーラーの処理の中から探していましたが、見つからずに悩んでました。