这是我的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按照它们在清单中声明的顺序应用资源。"。那么有人可以解释一下它应该是什么样的吗?
修改 我决定使用这个脚本:
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 :(得分:1)
您似乎遇到了无证件的行为。
当您运行puppet agent -t
时,Puppet代理会请求Puppet Master编译目录,并且在所有条件相同的情况下,由于您询问了订单,它会根据您在清单中的写入方式对所有内容进行排序(假设您有Puppet 4或Puppet 3的版本比2014年初更新)。
接下来,如果您通过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,
}