Puppet
Puppet:從模板中的定義中引用變數
我在 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>