[Ansible]特殊文字をエスケープ処理する方法


Ansibleを利用していると、replace,lineinfileなどでエスケープ処理をするタイミングがあると思います。その時に便利な方法です。

やりたいこと

以下の様なシェルスクリプトを以下のようにAnsibleで置換処理をしたい。

## /tmp/test.sh
#!/bin/bash

FILE="/tmp/hoge.txt"
# → FILE="/tmp/fuga.txt"

[ -e ${FILE} ] && echo "OK"
# → [ -s ${FILE} ] && echo "OK"

Ansibleタスクの記述

regexpに{{ item名 | regex_escape() }}のように記載をすると、特殊文字をエスケープ処理してくれます。
regexpの記述は特に気にせず、置き換えを実施したい文字列をそのまま記述すればよいので、便利です。エスケープし忘れなどのミスも防止出来るので、積極的に使っていきたいですね。

---
- name: test
  replace:
    dest: /tmp/test.sh
    regexp:  '{{ item.regexp | regex_escape() }}'
    replace: '{{ item.replace }}'
  with_items:
    - regexp:  'FILE="/tmp/hoge.txt"'
      replace: 'FILE="/tmp/fuga.txt"'
    - regexp:  '[ -s ${FILE} ] && echo "OK"'
      replace: '[ -e ${FILE} ] && echo "OK"'

結果

きれいに置換出来ました。

## /tmp/test.sh 
#!/bin/bash

FILE="/tmp/hoge.txt"

[ -s ${FILE} ] && echo "OK"