Puppet 错误重复声明已存在

Puppet 错误重复声明已存在,puppet,puppet-enterprise,Puppet,Puppet Enterprise,我在mon.pp文件中声明了这一点 $pem_file_path = "/etc/ssl/private/${::environment}.pem" $defaults = hiera_hash('defaults') $subscription_id = $defaults['subscription_id'] $pem_file_content = hiera('nb_monitoring::azure_limits_sa::pem_file_content') file

我在mon.pp文件中声明了这一点

  $pem_file_path = "/etc/ssl/private/${::environment}.pem"
  $defaults = hiera_hash('defaults')
  $subscription_id = $defaults['subscription_id']
  $pem_file_content = hiera('nb_monitoring::azure_limits_sa::pem_file_content')
  file { $pem_file_path:
  ensure  => 'present',
  owner   => 'root',
  group   => 'root',
  mode    => '0600',
  content => $pem_file_content
  }
  }
在另一个不同的模块>azure\u limits\u sa.pp中,我使用的是相同的东西

  # From ${::env}/mon.yaml
  $pem_file_content = hiera('nb_monitoring::azure_limits_sa::pem_file_content')

  file { $pem_file_path:
  ensure  => 'present',
  owner   => 'root',
  group   => 'root',
  mode    => '0600',
  content => $pem_file_content
 }
运行puppet时,出现以下错误:
错误:重复声明:文件[/etc/ssl/private/dev1.pem]已在文件/tmp/vagrant puppet/modules-2134b0ea668add24edb5ea5a9ee9f8a1/nb_tsg/manifests/mon.pp:25中声明;无法在节点dev1-mon1上的/tmp/vagrant puppet/modules-213400ea668add24edb5ea5a9ee9f8a1/nb_monitoring/manifests/azure_limits_sa.pp:43重新声明


如何解决这个问题?

最好的方法是为文件资源使用单独的类进行重构,这样就不会在同一主机上的两个类中使用相同的资源

或者,您可以在这两个类中使用:

 @file { $pem_file_path:
  ensure  => 'present',
  owner   => 'root',
  group   => 'root',
  mode    => '0600',
  content => $pem_file_content
 }
 realize File[$pem_file_path]

这在某种程度上违背了木偶的本性。为什么要在两个不同的位置管理同一文件,并将其全部应用于同一节点?若我是正确的,那个么在这两个puppet清单中从Hiera获得的数据是相同的,并将它们传递给文件资源。因此,可以安全地删除其中一个,或者您可以在第三个puppet manifest中将其解耦,该清单与文件(~>)具有通知关系,只要有更改,就可以将这些更改应用回文件

我需要在两个文件中都更改还是只能在一个文件中更改?
$pem\u File\u path=“/etc/ssl/private/${::environment}.pem”$defaults=hiera\u hash('defaults')$subscription\u id=$defaults['subscription\u id']$pem\u file\u content=hiera('nb\u monitoring::azure\u limits\u sa::pem\u file\u content')@file{$pem\u file\u path:sure=>'present',owner=>'root',group=>'root',mode>'0600',content=>$pem\u file\u content}实现文件[$pem_file_path]}
是否有任何特定的理由在两个不同的类中声明具有相同内容的同一文件?如果没有,我建议您只
确保该文件在一个类中存在,而在另一个类中声明(尽管检查顺序)。