我正在 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',
})