我有一个定义的资源types来追加一个文件,如果它不存在,如下所示:
define appendLineToFile($file, $line, $user) { exec { "echo \"\\n$line\" >> \"$file\"": path => '/bin', unless => "grep -Fx \"$line\" \"$file\"", user => $user, } }
它在大多数情况下都很有效,但是在下面这种情况下,双引号必须被两次转义(这非常令人费解)。
appendLineToFile { 'Add http_proxy & https_proxy to sudoers': file => '/etc/sudoers', line => "Defaults env_keep += \\\"http_proxy https_proxy\\\"", user => root, }
有没有办法改变它不需要转义的定义的资源types? 例如
line => "Defaults env_keep += \"http_proxy https_proxy\"",
两件事情:
Puppet与一个叫做Augeas的工具很好地结合在一起 :
Augeas是一个可爱的工具,它将configuration文件(好吧,任何真正的,但主要是configuration文件)视为值的树。 然后,您可以随意修改树,然后将文件写回。
对于Augeas能够理解的文件,进行编程更改非常容易,无需担心注释,空格,parsing或任何其他粘性细节。 另外,Augeas 支持sudoers文件格式 。
从sudo版本1.7.2开始,它支持includedir指令,允许你指定一个目录来扩展sudoers。 该目录中的文件必须包含有效的sudoers代码片段,而sudo将会像原来的文件一样读取和使用它们。 我在自定义资源中使用Puppet:
define sudo-include( content ) { file { "/etc/sudoers.d/$name": content => $content, mode => 0440, user => root, group => root, } } [...] sudo-include { "moreusers": content => "\ joe ALL=(ALL) ALL mike ALL=(ALL) NOPASSWD:ALL " }
当您使用sudo-include资源时,它会自动使用正确的权限在正确的位置创build文件,并且只需要为其指定名称和内容即可。
Handyman5build议使用Augeas 。 这是一个如何做到这一点的例子:
如果你想使用+=在一行上同时使用两个条目,可以这样使用Augeas:
augeas { "Add http_proxy & https_proxy to sudoers": context => "/files/etc/sudoers", # Only if no node exists for http_proxy onlyif => "match Defaults/env_keep/var[. = 'http_proxy'] size==0", changes => [ # Create a new Defaults line for the two variables "ins Defaults after Defaults[last()]", # Make this Defaults line a += type "clear Defaults[last()]/env_keep/append", # assign values to the two variables "set Defaults[last()]/env_keep/var[1] http_proxy", "set Defaults[last()]/env_keep/var[2] https_proxy", ], }
但是,您可能希望避免将两个variables关联起来,以便在已经设置了一个variables的情况下仍能正常工作。 在这种情况下,我会将问题分成两部分,只为http_proxy创build一个新的Defaults节点,然后为https_proxy重新使用它(具有依赖关系)。
除非使用的是使用破折号而不是bash作为默认shell的Debian Squeeze,否则可以在参数上使用单引号echo ,并使用-e来启用有限的转义字符。
另请参阅常用模块 ,以了解您正在做什么的至less两个实现。