Puppet错误:不能指定多个内容、源和目标

Puppet错误:不能指定多个内容、源和目标,puppet,hiera,Puppet,Hiera,我试图通过Puppet(使用Hiera)创建一个文件和一个符号链接。我运行的是Ubuntu 16.04,我使用的是所有最新的模块。 文件名为“a”,链接名为“b”。这些文件没有直接关系 我有一个节点的init.pp文件: define hiera::files ( $ensure, $content= "", $target="/./.", $mode = "", $owner = "root", $force = "false" ) { f

我试图通过Puppet(使用Hiera)创建一个文件和一个符号链接。我运行的是Ubuntu 16.04,我使用的是所有最新的模块。 文件名为“a”,链接名为“b”。这些文件没有直接关系

我有一个节点的init.pp文件:

define hiera::files (
    $ensure,
    $content= "",
    $target="/./.",
    $mode = "",
    $owner = "root",
    $force = "false" ) {

  file { $title:
    ensure  => $ensure,
    owner   => $owner,
    force   => $force,
    content => $content,
    mode    => $mode,
    target  => $target,
  }
}

create_resources('hiera::files', hiera_hash('files', {}))

node "default" {
  hiera_include('classes')
}
还有一个node.yaml文件,其中包含相应的数据:

files:
   /etc/a.txt:
   ensure: "present"
   mode: "2770"
   owner: "simon"
   content: "[d] \n type = sss \n resource = samba_1"

/etc/b:
   ensure: "link"
   target: "/usr/share/b"
   mode: "777"

我尝试过其他变体,但总是出现一个错误,即我不能指定多个
内容
源代码
目标
。两者都有可能吗?不是针对同一个文件,而是针对像我尝试做的那样的独立文件?

这里的问题是
hiera::files
默认值,因为即使您没有在hiera哈希中指定
内容
目标
,它们也被设置为:

define hiera::files ( $ensure, $content= "", $target="/./.", $mode = "",   $owner = "root", $force = "false" ){
$content
$target
的默认值更改为
unde
,因此如果要使用它们,必须指定它们

define hiera::files ( $ensure, $content = undef, $target = undef, $mode = "",   $owner = "root", $force = "false" ){
如果您确实需要这些默认值,那么您需要一种方法来避免在包含内容的文件上设置
target
,在包含
target
的文件上设置
content
,例如

define hiera::files ( $ensure, $content = undef, $target = undef, $mode = "",   $owner = "root", $force = "false" ){
  # Provide a default empty content value when ensure => present, and no content is given
  $real_content = $ensure ? {
    "present" => $content ? {
      undef   => "",
      default => $content,
    },
    default   => undef,
  }

  # Provide a default /./. target value when ensure => link, and no target is given
  $real_target = $ensure ? {
    "link"  => $target ? {
      undef   => "/./.",
      default => $target,
    },
    default => undef,
  }

  file { $title:
    ensure => $ensure,
    owner => $owner,
    force => $force,
    content => $real_content,
    mode => $mode,
    target => $real_target,
  }
}

或者最好使用单独的定义来明确行为。

请注意,您的Hiera数据似乎格式不正确。我怀疑这是在您准备问题时发生的,而不是在实际数据中,但由于我不能确定,我没有应用任何更正。还要注意,在顶部范围声明资源通常是不好的形式,包括通过
create_resources()
或其他函数间接声明资源。我强烈建议将此类声明放在类或节点块中,谢谢您的建议