[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のようにドメインを含む形のインベントリホスト名を指定する必要がありました。

前提環境

現象

インストール時には以下のようなインベントリファイルを利用しました。

[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 モジュールを利用したタスクです。


これは、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 GatewayGUI の [設定] > [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.pyvalidate メソッドのようでした。

バリデーションは Djangodjango.core.validatorsURLValidator クラスによるものでした。コードはこちら

(バージョンは 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 か判定しているのかわかってスッキリしました。

最初はエラーメッセージをインストーラーの処理の中から探していましたが、見つからずに悩んでました。