0.はじめに
Ansible で 動的に取得した変数値などを、replaceやtemplateモジュール、commandモジュールでのsedなどを利用せずに、Jinja2 filtersで正規表現を扱えないか調べたところregex_replace
が用意されていました。
1.使い方 サンプルプレイブック
以下は変数kb_msu"Windows8.1-KB3140735-x64.msu"を regex_replaceを利用して
例1)拡張子を置換して別の変数として定義
例2)真ん中の数字のみを抽出して別の変数として定義
debugモジュールで出力するサンプルのプレイブック
---
- 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_search
やregex_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