この記事は、Ansible Advent Calendar 2022 (Adventar 版) の 21日目の記事です。
はじめに
ansible-core 2.14.0 で、URL、URI、URN の文字列をチェックするテストプラグインが追加されました。
使用例は、それぞれのドキュメントページの Examples にいくつか掲載されています。
この中で、一番使用頻度の高そうな url テストプラグインを試してみます。
- 動作確認環境
- ansible-core 2.14.0
おためし
公式の Examples
まずは、url テストプラグインの Examplesに掲載されているものを試してみました。
true / false の結果をコメントで付記します。(uriと混在していますね)
--- - hosts: localhost gather_facts: false connection: local tasks: - name: debug url test debug: msg: # true - "{{ 'http://example.com' is url }}" # true - "{{ 'mailto://nowone@example.com' is not uri(schemes=['ftp', 'ftps', 'sftp', 'file']) }}" # false - "{{ 'mailto://nowone@example.com' is not uri }}" # true - "{{ 'ftp://admin:secret@example.com/path/to/myfile.yml' is url }}"
少し処理を追ってみる
処理が書いてる plugins/test/uri.pyを少し見ていました。ここには url、uri、 urn の 3つのテストプラグインがまとめて書かれています。
url テストプラグインの処理は、最初に is_uri つまり uri テストプラグイン相当の処理がかかるようです。schemes のチェックは is_uri 内で行われています。
その後 Python の urllib.parse.urlparseが通るかを調べています。
http:// や https:// のみに絞りたい場合
is url のように schemes 未指定だと、いろんなスキーマが許可されます。
例えば、以下は true です。
"{{ `'mailto://nowone@example.com' is url }}"
もし http:// や https:// のみに絞りたいときはありそうだなと思っていくつかのパターンを試しました。
--- - hosts: localhost gather_facts: false connection: local tasks: - name: debug url test ansible.builtin.debug: msg: # true - "{{ 'http://example.com' is url(schemes=['http']) }}" # false - "{{ 'https://example.com' is url(schemes=['http']) }}" # false - "{{ 'http://example.com' is url(schemes=['https']) }}" # true - "{{ 'https://example.com' is url(schemes=['https']) }}" # true - "{{ 'http://example.com' is url(schemes=['http', 'https']) }}" # true - "{{ 'https://example.com' is url(schemes=['http', 'https']) }}" # true - "{{ 'https://example.com:8080' is url(schemes=['http', 'https']) }}" # false (惜しい) - "{{ 'https//example.com' is url(schemes=['http', 'https']) }}" # false (惜しい) - "{{ 'https:/example.com' is url(schemes=['http', 'https']) }}" # false - "{{ 'mailto://nowone@example.com' is url(schemes=['http', 'https']) }}"
http のみ、https のみ、http か https、のそれぞれの動作が確認できました。
なお、テストコードでは、一部処理で http, https, ftp, ftps, ws, wss, file の schemes が指定されていました。
おわりに
これまでありそうでなかったという感じのテストプラグインでした。今後使う機会があるかもしれません。
参考
2.14.0 の Changelog
new tests url, uri and urn will verify string as such, but they don't check existance of the resource