Puppet 伪码解释

Puppet 伪码解释,puppet,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',

这是我的傀儡代码:

  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_脚本')执行得更早,但文档中说“Puppet按照资源在清单中声明的顺序应用资源。”。有人能给我解释一下它应该是什么样子吗

编辑 我决定使用以下脚本:

  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实际上会修补编译的目录,并为远程目录中的每个文件添加一个资源。(傀儡继续遵守舱单命令。)

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

因此,在您的情况下,Puppet根本不知道
internal_folder/script
,并且您没有指定任何内容,因此Puppet只创建一个空文件

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

我同意Matt Schuchard的观点,鉴于您的需求,这里最好的做法就是在远程目录中设置可执行标志(
+x

但是,除此之外,您还需要使用
source\u权限=>use
():


如果先执行第二个资源,则从逻辑上讲,脚本不会为空。无论如何,这里阻力最小的路径是脚本可以在源代码中执行。谢谢你的回答。是的,我想让它在源代码中执行。但我想知道为什么我的解决方案没有像预期的那样有效。另外,若第二个资源先被执行,那个么它只会创建一个空的可执行文件(就像在我的例子中发生的那个样),或者我错了吗?好问题。我找到了答案,并在下面回答@peterSchiza@peterSchiza Yes它将创建一个空的可执行文件,然后由脚本替换为第一个资源中的内容。因此,您的第二个资源不能先执行。@Alexarvey我不是在谈论清单排序,我也在解释为什么他的理论会发生这种情况,因为第二个资源先执行是无效的。遗憾的是,它不起作用。我已经在remote上更改了该文件(+x)的模式,但在我在客户端上运行puppet脚本后,它并没有该模式。。。你知道怎么做吗?“我做错了什么?”彼得奇扎,你没有做错。我只是测试了一下,很遗憾,正如你所说,它不起作用。这让我们在这里只有糟糕的选择,我更新了帖子。实际上,我的建议不是使用
recurse=>true
,而是找到另一种方法来解决这个问题。谢谢您的回复。我决定使用另一种方法,并将其包含在我的第一篇文章中(不知道它是否比你的好)。另外,如何在不使用
recurse=>true的情况下复制目录?好主意。是的,我认为这是最好的答案。你真的应该把它作为一个“答案”,而不是添加到问题中。这样我们就可以将问题标记为已解决。@peterSchiza我刚刚发现了一个更好的方法,并更新了答案:
  file { 'copy_files':
     path => "/data/files",
     source => "puppet:///modules/mymodule/repo",
     source_permissions => use,
     recurse => true,
  }