web-dev-qa-db-ja.com

ansible変数のパターンに一致する部分文字列をフィルタリングし、一致した部分文字列を別の変数に割り当てます

長いansible文字列変数mystrがあるとします。正規表現パターンsubstr_patternがあり、このパターンに一致する部分文字列がmystrから除外され、別の変数substrに割り当てられます。 pythonのreモジュールでこれを行うのは簡単ですが、 playbook_filters のドキュメントからこれをansibleで行う明確な方法はないようです自体。

Ansible docsには3つの方法があり、どれも私の問題を解決していないようです。

  1. match:このフィルターは、パターン全体が文字列全体と一致するかどうかに応じてtrue/falseを返しますが、一致したグループ/部分文字列は返しません。

  2. search:より大きな文字列でsubstrをフィルタリングするために使用されます。ただし、matchと同様に、true/falseのみを返し、ここで必要な一致するグループ/サブストリングは返しません。

  3. regex_replace:これは、ストリング内の一致したパターンを別のストリングで置き換えるために使用されます。しかし、一致したパターンに対応する部分文字列/グループを新しい変数に登録する方法は明確ではありません。

不足しているものはありますか?または、これはansibleの欠けている機能ですか?

Ansibleバージョン:2.1

例:

mystr: "This is the long string. With a url. http://example.org/12345"
pattern: "http:\/\/example.org\/(\d+)"
substr: 12345   # First matched group i.e. \\1

概要:patternからmystrに一致する部分文字列を取得して、それをansible変数substrに登録する方法

10
Pranjal Mittal

パターンを変更できる場合は、regex_replaceフィルタリングして、文字列全体を一致した数字のみで置き換えます。

mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1')

結果を新しい変数に割り当てるには、set_factモジュール。

- set_fact:
    substr: "{{ mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1') }}"
18
udondan