1

Puppetでこの問題を解決する方法を考えられますか?

実行されているドメインに応じてIPアドレスの文字列を生成するカスタムファクトがあります。1からn個のアドレスを持つように解決できます。

"10.1.29.1"
"10.1.29.1,10.1.29.5"
"10.1.29.1,10.1.29.5,10.1.29.7"
etc

たとえば、servernameXの生成されたサーバー名を使用してこれらをホストファイルに追加したいと思います。

10.1.29.1 myservername1
10.1.29.5 myservername2
10.1.29.7 myservername3

では、puppetには「foreach」のような配列イテレータがないので、どうすればこれを行うことができますか?

4

1 に答える 1

6

悲しいことに、カスタムの「定義」を使用して、カスタムファクトをカンマで分割して配列を反復処理しても、結果は期待したものではなく、「for each」ループにさえ近づきません-頭が痛くなるだけでなく、おそらく。

これがあなたが達成したいことかどうかはわかりませんが、このアプローチを見てください:

$fact = '1.1.1.1,2.2.2.2,3.3.3.3'

$servers = split($::fact, ',')
$count   = size($servers)

$names = bracket_expansion("host[01-${count}].address")

file { '/tmp/test.txt':
  content => inline_template('<%= @servers.each_with_index.map {|v,i| "#{v}\t\t#{@names[i]}\n" } %>'),
  ensure  => present
}

size() と bracket_expansion() の 2 つのカスタム関数があります。次に、inline_template() 関数を活用するハック内で提供される値を使用して、2 つの配列への並列アクセスを利用してファイルのコンテンツをレンダリングします。

結果は次のとおりです。

matti@acrux ~ $ cat | puppet apply
$fact = '1.1.1.1,2.2.2.2,3.3.3.3'

$servers = split($::fact, ',')
$count   = size($servers)

$names = bracket_expansion("host[01-${count}].address")

file { '/tmp/test.txt':
  content => inline_template('<%= @servers.each_with_index.map {|v,i| "#{v}\t\t#{@names[i]}\n" } %>'),
  ensure  => present
}
notice: /Stage[main]//File[/tmp/test.txt]/ensure: created
notice: Finished catalog run in 0.07 seconds
matti@acrux ~ $ cat /tmp/test.txt 
1.1.1.1         host01.address
2.2.2.2         host02.address
3.3.3.3         host03.address
matti@acrux ~ $

size() と bracket_expansion() 関数の両方がここにあります:

https://github.com/kwilczynski/puppet-functions/tree/master/lib/puppet/parser/functions/

これが少し役立つことを願っています:-)

于 2012-09-02T19:10:15.773 に答える