Help us understand the problem. What is going on with this article?

Ansibleでtemplateのdestに設定されている値を取得する

More than 5 years have passed since last update.

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

noel9109
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away