2017-06-12 123 views
1

说明这里是我的木偶代码:的木偶代码

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" 
    } 

我要的是复制我的文件夹(“回购”),然后让一个可执行脚本。但是,通过上面的代码,脚本中的所有内容都被清除(脚本只是空文件)。没有那个额外的资源('chmod_script')文件的内容是预期的(没有被擦除)。所以我在这里做错了什么?我认为这可能是因为第二个资源('chmod_Script')在早些时候执行,但文档说“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" 
    } 

所以在更新模式,我复制内容一次。

+0

如果第二资源首先被执行,那么从逻辑脚本就不会是空的。无论如何,这里阻力最小的路径是脚本可以在源代码中执行。 –

+0

感谢您的回答。是的,我想过让它在源代码中可执行。但想知道为什么我的解决方案不能按预期工作。另外,如果第二个资源被首先执行,那么它会创建空的可执行文件(就像它发生在我的情况),或者我错了吗? –

+0

伟大的问题。我计算出来并在@peterSchiza下面回答。 –

回答

1

您似乎遇到了无证行为。

当你运行puppet agent -t时,Puppet Agent会请求Puppet Master编译一个目录,并且所有的事情都是平等的,因为你询问了排序,它根据你在清单中的写法来命令一切(假设你拥有Puppet 4或比2014年初更新的Puppet 3版本)。接下来,如果您通过recurse要求Puppet镜像远程目录,Puppet实际上会修补已编译的目录并为远程目录中的每个文件添加资源。 (并且Puppet继续履行舱单的订单。)

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

所以,你的情况,木偶不知道任何有关 inner_folder/script远程内容,并且您还没有指定任何内容,因此木偶只是创建一个空文件。

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

我与马特Schuchard同意,最好的办法在这里,给您的要求,只是在远程目录中设置可执行标志(+x)。

此外,然而,你还需要使用source_permissions => usedoc):

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

不幸的是,它不起作用。我已经改变了远程文件(+ x)​​的模式,但它没有在客户端运行木偶脚本之后有任何想法该怎么办?或者我做错了什么? –

+0

@peterSchiza,你不是做错了。我只是对它进行了测试,可悲的是,正如你所说,它不起作用。这使我们只能在这里遇到不好的选择,我更新了这篇文章。实际上,我的建议不是使用'recurse => true',而是寻找解决此问题的另一种方法。 –

+0

感谢您的回复。我决定使用另一种方法,并将其包含在我的第一篇文章中(不知道它是否比你的更好)。另外,如何在不使用'recurse => true'的情况下完成复制目录? –