【Ansible】[name="hoge"]から[hoge]だけ抜き出す方法

f:id:hira98:20190720154231p:plain

【結論】

  • AnsibleでXMLを解析するには、XMLを解析するための.ymlファイルを別途用意する必要がある。

  • 正規表現を使いこなせれば、XMLに限らずどんなファイルでも解析できる。

  • しかし、正規表現を使いこなせないと、1行のコードを書くのに1日以上費やしてしまうハメになる😭

【目次】

はじめに

APIを叩いて取得したXMLの文字列から、必要な部分だけを取り出してリストにする。

要は、これを

"<name=\"Apple-01\"><name=\"Orange-02\"><name=\"Banana-03\">"

こうしたい

["Apple-01", "Orange-02", "Banana-03"]

ということをAnsibleで行う場合、XMLを解析するための.ymlファイルを別途別途用意する必要があります。

しかし、わざわざ別ファイルを用意するのも手間だったので、今回は正規表現を使ってリスト化しました。

Pythonで書いた場合

ソース(.py)

import re # 正規表現操作モジュール

# ダミーデータ設定
fruit_str = "<name=\"Apple-01\"><name=\"Orange-02\"><name=\"Banana-03\">"
print(f"str  => {fruit_str}")

# nameの文字の抜き出し
fruit_list = re.findall(r'name=\"([A-Za-z0-9-]*)\"', fruit_str)
print(f"list => {fruit_list}")

実行結果

str  => <name="Apple-01"><name="Orange-02"><name="Banana-03">
list => ['Apple-01', 'Orange-02', 'Banana-03']

Ansibleで書いた場合

ソース(.yml)

---
- hosts: localhost  # 自分自身に接続する
  tasks:
  - name: ダミーデータ設定
    set_fact:
      fruit_str: "<name=\"Apple-01\"><name=\"Orange-02\"><name=\"Banana-03\">"
  - debug: msg="str  => {{fruit_str}}"

  - name: nameの文字の抜き出し
    set_fact:
      fruit_list: "{{ fruit_str | regex_findall('name=\"([A-Za-z0-9-]*)\"') }}"
  - debug: msg="list => {{ fruit_list }}"

実行結果

f:id:hira98:20190720154255p:plain

参考情報

Filters — Ansible Documentation

re --- 正規表現操作 — Python 3.7.4 ドキュメント

基本的な正規表現一覧 | murashun.jp

さいごに

正規表現という呪文を使いこなせるようになりたい。