Puppet

Puppet:從模板中的定義中引用變數

  • September 8, 2009

我在 puppet 中有以下類和定義:

$certDirectory = "/var/lib/ssl/certs"

class openssl {
 package { "openssl":
   ensure => latest
 }
 file { "openssl":
   path => "/var/lib/ssl",
   ensure => directory,
   mode => 0644
 }
 file { "openssl-certs":
   path => "/var/lib/ssl/certs",
   ensure => directory,
   mode => 0644
 }
 define cert($ensure = present) {
   $certfile = "${certDirectory}/${name}.cert"
   $keyfile = "${certDirectory}/${name}.key"
   $pemfile = "${certDirectory}/${name}.pem"

   file { "${name}.cert":
     path => $certfile,
     source => "puppet:///openssl/${name}.cert",
     mode => 0640,
     ensure => $ensure,
   }
   file { "${name}.key":
     path => $keyfile,
     source => "puppet:///openssl/${name}.key",
     mode => 0640,
     ensure => $ensure,
   }
 }
}

我稍後(在節點中)使用此 openssl::cert 定義將證書傳遞給 apache vhost 配置:

openssl::cert { "rri":
 ensure=>present
}

apache2::site-config { "default":
 ip => "*",
 order => "000",
 docroot => '/home/support/public_html',
 cert => Openssl::Cert["rri"]
}

在 apache2::site-config 內部定義:

 file { "site-config-$name":
   path => "/etc/apache2/sites-available/$name",
   owner => root,
   group => root,
   mode => 0644,
   content => template($template),
   notify => Exec["reload-apache2"],
 }

我遇到的問題 - 如何從位於 $template 的 .erb 文件中的 cert 變數中引用$certfile/ ?$keyfile

我也很想知道我是否也以錯誤的方式接近這個問題 - 這是我第一次嘗試使用 puppet 進行任何設置,只是嘗試嘗試我能做的事情。

更新 - 現在半工作 基於 freiheit 的回答 - 我對我的 apache2::site-config 做了一些更改

  define site-config (
   $ensure = 'present',
   $template = 'apache2/vhost.erb',
   $docroot,
   $ip='*',
   $order='000',
   $logs = "",
   $cert = false) {

     if $cert {
       File["site-config-$name"] { require=>Openssl::Cert[$cert] }
       $certfile = "${openssl::certDirectory}/${cert}.cert"
       $keyfile = "${openssl::certDirectory}/${cert}.key"
     }

     file { "site-config-$name":
       path => "/etc/apache2/sites-available/$name",
       owner => root,
       group => root,
       mode => 0644,
       content => template($template),
       notify => Exec["reload-apache2"],
     }

然後在.erb

  SSLCertificateFile    <%= certfile %>
  SSLCertificateKeyFile <%= keyfile %>

這似乎工作得相當好 - 我只是希望如果我在某個時候更改證書命名約定,我將能夠從對 Openssl::Cert 資源的引用中訪問實際文件名。仍然很想知道是否有辦法做到這一點。

$template.erb 中有這樣的東西:

<VirtualHost <%= ip %>:443>
 Document Root <%= docroot %>
 SSLCertificateFile <%= cert %>
 # ...
</VirtualHost>

也就是說,puppet 中的任何變數都可以作為隱藏在 .erb 文件中的 ruby​​ 位中的局部變數使用。

不知道為什麼你有“ $ template" instead of a named .erb file (not seeing $ 模板設置在任何地方,但願意假設它隱藏在某個地方)

這似乎是錯誤的:cert => Openssl::Cert["rri"]。我期待更多類似的東西:

openssl::cert { "rri": }

然後 .erb 會更像:

<VirtualHost <%= ip %>:443>
 Document Root <%= docroot %>
 SSLCertificateFile <%= certDirectory %>/<%= name %>
 # ...
</VirtualHost>

引用自:https://serverfault.com/questions/63401