Python
正規表現
Ansible

Ansible Jinja2 filters 正規表現で変数の文字列を置換、抽出する

More than 1 year has passed since last update.


0.はじめに

Ansible で 動的に取得した変数値などを、replaceやtemplateモジュール、commandモジュールでのsedなどを利用せずに、Jinja2 filtersで正規表現を扱えないか調べたところregex_replaceが用意されていました。


1.使い方 サンプルプレイブック

以下は変数kb_msu"Windows8.1-KB3140735-x64.msu"を regex_replaceを利用して

例1)拡張子を置換して別の変数として定義

例2)真ん中の数字のみを抽出して別の変数として定義

debugモジュールで出力するサンプルのプレイブック


regex_raplace.yml

---

- hosts: localhost
connection: local
gather_facts: no
vars:
kb_msu: "Windows8.1-KB3140735-x64.msu"
# 例1)kb_msuの拡張子を.msuから.xmlへ置換
kb_xml: "{{ kb_msu | regex_replace('.msu','.xml') }}"
# 例2) kb_msuの'-KB'と'-'との間の数字を抽出
kb_no: "{{ kb_msu | regex_replace('^.*-KB(\\d*)-.*msu$','\\1') }}"
tasks:
- debug: msg="kb_msu={{ kb_msu }} , kb_xml={{ kb_xml }} , kb_no={{ kb_no }}"


2.実行結果

# ansible-playbook regex_raplace.yml

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

TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": "kb_msu=Windows8.1-KB3140735-x64.msu, kb_xml=Windows8.1-KB3140735-x64.xml , kb_no=3140735"
}

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


3.参考

公式サイトでのJinja2 filtersの使い方(英語)はこちら

他にもいろいろと便利なフィルター(Windows関連や正規表現をエスケープしてくれるものなど)

が追加・更新?されていましたので、定期的に覗くと良いかもしれません。

なお、現時点(2016/07/04)では公式サイトには載っていないのですが、

正規表現関連としてはregex_searchregex_findallなども使えるようです。

Version 2.2.0から?でしょうか?(ansible 2.2.0 (devel 394430a61e) last updated 2016/06/28 13:25:07 (GMT +900)では使えました)

以下はAnsible-Webinar用コードの一部

https://github.com/privateip/Ansible-Webinar-Mar2016/blob/master/roles/network_facts/tasks/ios.yaml