てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] リストの中から正規表現でマッチする要素を取り出す select('match', regexp)

はじめに

Ansible が内部的に利用している Jinja2 には select という、リストに対して様々な操作をするフィルターがあります。

ドキュメントの例には載っていませんが、match というキーワードを利用すると、正規表現をつかった抽出ができます。と、同僚に教わりました(感謝)。

この記事では、かんたんなサンプルを元に、リストの中から正規表現でマッチする要素を取り出す例をご紹介します。

  • 動作確認環境
    • Ansible 2.9.6

サンプル

リスト test_list の各要素に対して、正規表現 .+[2-4].+ にマッチする要素のみに抽出するサンプルです。

Playbook

- hosts: localhost
  gather_facts: false

  vars:
    test_list:  # 抽出対象のリスト
      - xxx1xxx
      - xxx2xxx
      - xxx3xxx
      - xxx4xxx
      - xxx5xxx

  tasks:
    - name: list match
      debug:
        msg: "{{ test_list | select('match', '.+[2-4].+') | list }}"  # ポイント

実行例

Playbook を実行します。

$ ansible-playbook -i localhost, match.yml 

PLAY [localhost] **************************************************************************************************

TASK [list match] *************************************************************************************************
ok: [localhost] => {
    "msg": [
        "xxx2xxx",
        "xxx3xxx",
        "xxx4xxx"
    ]
}

PLAY RECAP ********************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

対象リストの各要素の中から、.+[2-4].+ にマッチする 3つがリストとして抽出できました。

参考

qiita.com