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 资源的引用中访问实际文件名。仍然想知道是否有办法做到这一点。

答案1

$template.erb 中的内容如下:

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

也就是说,puppet 中的任何变量都可以作为隐藏在 .erb 文件中的 ruby​​ 位中的局部变量使用。

不确定为什么使用“$template”而不是命名的 .erb 文件(没有看到任何地方设置 $template,但愿意假设它隐藏在某个地方)

这似乎是错误的:cert => Openssl::Cert["rri"]。我期望更多像这样:

openssl::cert { "rri": }

然后 .erb 会更像这样:

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

相关内容