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"