Puppet: Referenciando variáveis de uma definição em um modelo

5

Eu tenho a seguinte classe e definição em fantoche:

$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,
    }
  }
}

Estou mais tarde (em um nó) usando este openssl :: cert para passar um certificado para uma configuração do vache do apache:

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

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

E dentro do apache2 :: site-config, defina:

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

A pergunta que estou tendo - como posso referenciar o $certfile / $keyfile da variável cert no arquivo .erb localizado em $ template?

Eu também ficaria muito interessado em saber se eu estou me aproximando disso da maneira errada também - é a primeira vez que tento configurar algo usando o fantoche e apenas tentando brincar com o que eu posso fazer.

ATUALIZADO - Semi trabalhando agora Com base na resposta do freiheit - fiz algumas alterações no meu 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"],
      }

Então no .erb

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

Isso parece estar funcionando razoavelmente bem - eu estava esperando que, caso eu alterasse as convenções de nomenclatura do certificado em algum momento, eu conseguisse acessar os nomes de arquivos reais da referência ao recurso Openssl :: Cert . Ainda curioso para saber se existe uma maneira de fazer isso.

    
por gnarf 08.09.2009 / 18:26

1 resposta

4

Algo parecido com isso em $ template.erb:

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

Isto é, qualquer variável no fantoche está disponível como uma variável local nos bits rubi escondidos no arquivo .erb.

Não sei por que você tem "$ template" em vez de um arquivo .erb (não vendo $ template definido em lugar nenhum, mas disposto a assumir que está escondido em algum lugar)

E isso parece errado: cert => Openssl::Cert["rri"] . Eu esperaria algo mais como:

openssl::cert { "rri": }

E então o .erb seria mais parecido com:

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