如何在 Puppet 定义的资源中创建公共目录

如何在 Puppet 定义的资源中创建公共目录

我正在 Puppet 中实现定义的资源来创建一些网站。

其中一个步骤是创建网站的 documentroot 目录。

我的问题是某些网站可以共享一个共同的 documentroot。发生这种情况时,我会收到错误:

Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Error while evaluating a Resource Statement, Evaluation Error: Error while evaluating a Resource Statement, Cannot alias File[documentroot-redirpt] to ["/var/www/vhosts/parkingyredir"] at /etc/puppetlabs/code/environments/production/modules/xxx_corp_webserver/manifests/website.pp:164; resource ["File", "/var/www/vhosts/parkingyredir"] already declared at /etc/puppetlabs/code/environments/production/modules/xxx_corp_webserver/manifests/website.pp:164 at /etc/puppetlabs/code/environments/production/modules/xxx_corp_webserver/manifests/website.pp:164:3 at /etc/puppetlabs/code/environments/production/modules/xxx_corp_webserver/manifests/init.pp:10 on node llim605

那么,我如何创建一个资源,以便它将创建目录,但如果我尝试创建它几次则不会抱怨?

documentroot 目录的所有者和权限是恒定的。

答案1

抱歉,发布问题几分钟后才找到答案。

如果资源有可能被重新定义,只需检查它是否已经被定义。

  if !defined(File[$documentroot]) {
    file { "documentroot-${title}":
      ensure => 'directory',
      path   => $documentroot,
      group  => '0',
      mode   => '0755',
      owner  => '0',
      }
    }

答案2

木偶文档状态:

警告:避免依赖模块中的函数结果defined,因为您可能无法很好地保证求值顺序以产生一致的结果。这可能会导致依赖该函数结果的其他代码行为不一致或失败。

另一种(也许更可靠)的解决方案是ensure_resource使用puppetlabs-stdlib。仅当资源不存在时才会创建资源,并且仅当资源已存在并且没有匹配的参数时才会引发重复声明错误。

ensure_resource('file', $documentroot, {
  ensure => 'directory',
  owner  => '0',
  group  => '0',
  mode   => '0755',
})

相关内容