Ansibleでtemplateのdestに設定されている値を取得する
Ansibleでtemplateタスクを使う時、これから生成しようとするファイルが既に存在する場合、そのファイルには、どんな値が設定されているか知りたい時がある。
そこで、現在のdestの変数部分にあたる値を取得するスクリプトをざっくり書いてみた。
こんなansibleのタスクと、
- template: | src=src.conf dest=dest.conf
こんなtemplateがあるとする。
tmp_dir={{ tmp_dir }}
で、既にdestにあたるファイルが存在する場合、変数部分に何の値が入っているか知りたい。この例だと/tmpにあたる。
tmp_dir=/tmp
そこで、以下のスクリプトを書いてみた。
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だとちょい物足りないときとか使えばいい。