てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] URLの文字列をチェックするテストプラグインをためしてた

この記事は、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を少し見ていました。ここには urluriurn の 3つのテストプラグインがまとめて書かれています。

url テストプラグインの処理は、最初に is_uri つまり uri テストプラグイン相当の処理がかかるようです。schemes のチェックは is_uri 内で行われています。

その後 Pythonurllib.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 のみ、httphttps、のそれぞれの動作が確認できました。

なお、テストコードでは、一部処理で http, https, ftp, ftps, ws, wss, fileschemes が指定されていました。

おわりに

これまでありそうでなかったという感じのテストプラグインでした。今後使う機会があるかもしれません。

参考

2.14.0 の Changelog

github.com

new tests url, uri and urn will verify string as such, but they don't check existance of the resource

関連 PR

github.com