4

Puppetを使い始めたばかりですが、最初のテンプレートで問題が発生しています。とても簡単なはずですが、わかりません。

私はモジュール「ベース」を持っています

/etc/puppet/modules/base/
    ./manifests
    ./manifests/service.pp
    ./manifests/init.pp
    ./manifests/params.pp
    ./manifests/config.pp
    ./manifests/install.pp
    ./templates
    ./templates/puppet.conf.erb

他にもありますが、必須ではありません。

base / manifests / init.pp:

class base {
  include base::install, base::service, base::config, base::params
}

base /manifests / config.pp

class base::config {
  include base::params

  File {
    require => Class["base::install"],
    ensure => present,
    owner => root,
    group => root,
  }

  file { "/etc/puppet/puppet.conf":
    mode => 0644,
    content => template("base/puppet.conf.erb"),
    require => Class["base::install"],
    nofity => Service["puppet"],
  }
...

ベース/マニフェスト/params.pp

class base::params {
  $puppetserver = "pup01.sdirect.lab"
}

最後に、base / templates/puppet.conf.erbにあるテンプレートの興味深い部分

...
server=<% puppetserver %>

エラーメッセージ:

エラー:テンプレートbase / puppet.conf.erbの解析に失敗しました:ノードの/etc/puppet/modules/base/manifests/config.pp:13で「puppetserver」の値が見つかりませんでした...

問題が何なのかわかりません。私はこの部分をProPuppetの本から直接コピーしました。

$ puppetserverをどこでどのように定義する必要があるかを誰かに教えてもらえますか?

4

3 に答える 3

16

問題は、「puppetserver」という名前は、テンプレートが評価されるスコープとは異なるスコープで定義されているため、Puppetが値を見つけることができるように完全に修飾する必要があることです。

変数はで定義されてbase::paramsいるため、そのスコープでは単に「puppetserver」とのみ参照できます。内からテンプレートを評価しているときbase::configは、別のスコープにいるため、変数を単にその短い名前で参照することはできません。「include」は他のクラスをカタログに追加しますが、これらのルールは変更しません。

これは、それにアクセスすることを意味し、クラス名で完全に修飾しますbase::params::puppetserver。マニフェスト自体で使用している場合、これはになります$base::params::puppetserverssh::configおよびクラスのProPuppetで同様の例が表示ssh::serviceされ、paramsクラスの「ssh_service_name」が参照されます(43〜45ページ)。

テンプレート内の変数にアクセスするには、少し異なります。を使用しますscope.lookupvar("base::params::puppetserver")。完全な例を取り上げて、テンプレートに(値を出力するために)欠落している等号を追加します。

...
server=<%= scope.lookupvar("base::params::puppetserver") %>

2.7ページの時点で、スコープとパペットのスコープについてもう少し情報があります。

(編集:同じ解決策で確認済みの正誤表ページにもリストされているようです。)

于 2012-05-14T22:01:18.160 に答える
6

回答#1は技術的には正しいですが、非常に冗長なテンプレートになります。

他のクラスの変数値を独自のクラススコープに取り込むことで、それらを短縮できます。

class base::config {
  include base::params
  $puppetserver = $base::params::puppetserver
  ...
}

そして、期待どおりにテンプレートでそれらを使用します。

server=<% puppetserver %>
于 2013-08-12T17:26:19.710 に答える
1

継承を使用することもできます。

class puppet::config inherits puppet::params {
....

$puppetserverこのようにして、このクラスで再度定義する必要はありません。

于 2014-10-05T20:48:15.230 に答える