Ansibleでtemplateタスクを使う時、これから生成しようとするファイルが既に存在する場合、そのファイルには、どんな値が設定されているか知りたい時がある。
そこで、現在のdestの変数部分にあたる値を取得するスクリプトをざっくり書いてみた。
こんなansibleのタスクと、
example.yml
- template: |
src=src.conf
dest=dest.conf
こんなtemplateがあるとする。
src.conf
tmp_dir={{ tmp_dir }}
で、既にdestにあたるファイルが存在する場合、変数部分に何の値が入っているか知りたい。この例だと/tmpにあたる。
dest.conf
tmp_dir=/tmp
そこで、以下のスクリプトを書いてみた。
get_dest_value.rb
delimitor="!!del!!"
template_variable_symbol=/{{.*?}}/
src_filename=ARGV[0]
dest_filename=ARGV[1]
src_file=open(src_filename).read.split("\n")
dest_file=open(dest_filename).read.split("\n")
cnt=0
src_file.each{|f|
src_str=src_file[cnt]
dest_str=dest_file[cnt]
mask=src_str.gsub(template_variable_symbol,delimitor).split(delimitor)
template_variable=src_str.scan(template_variable_symbol)
dest_variable=[]
(0..mask.size-1).each{|i|
mask_preffix=""
(0..i).each{|i|
if i==0
mask_preffix+=mask[i]
else i>0
if !dest_variable[i-1].nil?
mask_preffix+=dest_variable[i-1]
mask_preffix+=mask[i]
end
end
}
mask_suffix=""
if mask[i+1].nil?
mask_suffix="$"
else
mask_suffix=mask[i+1]
end
/#{mask_preffix}(.*?)#{mask_suffix}/ =~ dest_str
dest_variable << $1
print "#{template_variable[i]} : #{dest_variable[i]}\n"
}
cnt+=1
}
スクリプトを実行すると、destに設定されている値が表示される。
templateがマスクになってるイメージですかね。
$ ruby get_dest_value.rb src.conf dest.conf
{{ tmp_dir }} : /tmp
サーバで設定ファイル直接書き換えられてる可能性がある場合や、
未知のサーバに対してtemplate適用したい際の現状調査や、
serverspecと組み合わせて、設定ファイルのテストとかできる。
ansibleのDry-runだとちょい物足りないときとか使えばいい。