Puppet代码解释

Explanation of Puppet code

这是我的 Puppet 代码:

  file { 'copy_files':
     path => "/data/files",
     source => "puppet:///modules/mymodule/repo",
     recurse => true;
  }
  file {'chmod_script':
     path => "/data/files/inner_folder/script",
     ensure => 'present',
     mode => "+x"
  }

我想要的是复制我的文件夹 ('repo'),然后使一个脚本可执行。然而,使用上面的代码,我的脚本中的所有内容都被删除了(脚本只是空文件)。没有该附加资源 ('chmod_script') 文件的内容如预期的那样(未删除)。那我在这里做错了什么吗?我认为这可能是因为第二个资源('chmod_Script')执行得更早,但文档说 "Puppet applies resources in the order they’re declared in their manifest."。那么有人可以向我解释它应该是什么样子吗?

编辑 我决定使用这个脚本:

  file { 'copy_files':
     path => "/data/files",
     source => "puppet:///modules/mymodule/repo",
     recurse => true;
  }
  file {'chmod_script':
     path => "/data/files/inner_folder/script",
     source => "puppet:///modules/mymodule/repo/inner_folder/script",
     ensure => 'present',
     mode => "+x"
  }

所以在更新模式的同时,我再次复制了内容。

您似乎运行正在从事未记录的行为。

当你运行puppet agent -t时,Puppet Agent 请求 Puppet Master 编制目录,在所有条件相同的情况下,既然你询问了排序,它就会根据你的方式排序所有内容已将其写入清单(假设您有 Puppet 4 或比 2014 年初更新的 Puppet 3 版本)。

接下来,如果您通过 recurse 要求 Puppet 镜像远程目录,Puppet 实际上会修补已编译目录并为远程目录中的每个文件添加资源。 (并且 Puppet 继续遵守清单顺序。)

但这就是问题所在。不允许重复的资源,因此如果编译目录已经包含与将通过 recurse 添加的文件重叠的文件资源,Puppet 会决定保留哪一个。如果目录已通过特定声明包含文件资源,则目录中已有的资源将获胜。

因此,在您的情况下,Puppet 对远程内容一无所知 inner_folder/script,并且您还没有指定任何内容,所以 Puppet 只是创建一个空文件。

(此外,请查看 Bug 2296 中的讨论以了解其他相关边缘情况下的行为。)

我同意 Matt Schuchard 的观点,根据您的要求,这里最好的做法是在远程目录中设置可执行标志 (+x)。

除此之外,您还需要使用 source_permissions => use (doc):

  file { 'copy_files':
     path => "/data/files",
     source => "puppet:///modules/mymodule/repo",
     source_permissions => use,
     recurse => true,
  }