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だとちょい物足りないときとか使えばいい。