自我训练puppet
并编写了以下清单:
class bratch::test {
file { '/var/cache/tempFile':
owner => 'root',
group => 'root',
mode => '0644',
source => "puppet://${puppetserver}/modules/bratch/tempFile"
}
exec { "create_file":
command => "/bin/echo boop >> /tmp/outputFile",
}
按照我的预期工作,但直到事后才真正考虑该执行行。
如果puppet
理解输出重定向是否意味着它调用 shell?如果是的话,它的环境从何而来?它是每次都初始化环境还是直接从puppet代理继承?
答案1
这文档在这一点上有点令人困惑:
供应商
POSIX
直接执行外部二进制文件,无需通过 shell 或执行任何插值。这是执行大多数命令的更安全、更可预测的方式,但会阻止使用通配符和 shell 内置命令(包括“for”和“if”语句等控制逻辑)。
默认为
feature
==posix
。壳
通过 传递提供的命令
/bin/sh
;仅适用于 POSIX 系统。这允许使用 shell 通配符和内置命令,并且不要求命令的路径是完全限定的。虽然这可能比posix
提供者更方便,但这也意味着你需要更加小心转义;一如既往,强大的力量来了等等。
exec
该提供程序与 Puppet 0.25.x 中类型的行为非常相似。
因此,如果您使用shell
提供程序,您应该能够使用重定向,但默认是posix
,即直接执行,所以除非您指定shell
,而您没有指定...
无论哪种情况,文档都没有过多说明环境。需要检查一下代码:
begin
# Do our chdir
Dir.chdir(dir) do
environment = {}
environment[:PATH] = resource[:path].join(File::PATH_SEPARATOR) if resource[:path]
看起来它被设置为空,然后填充我们使用该environment
字段提供的任何设置,因此每次都会重新初始化。
然而,如果我们跟随面包屑,我们就会发现函数调用它执行:
output = Puppet::Util::Execution.execute(command, :failonfail => false, :combine => true,
:uid => resource[:user], :gid => resource[:group],
:override_locale => false,
:custom_environment => environment)
Execution.execute
来电execute_posix
,这反过来又做:
command = [command].flatten
...
options[:custom_environment] ||= {}
Puppet::Util.withenv(options[:custom_environment]) do
Kernel.exec(*command)
我不了解 Ruby,我想说除非您显式地将命令及其参数指定为数组,并且只给出类似 的字符串"/bin/echo boop >> /tmp/outputFile"
,否则命令行将按原样传递给Kernel.exec
,其中:
该字符串被视为命令行,在执行之前需要进行 shell 扩展。
这就是为什么您可以使用重定向而无需设置shell
为提供者。进一步地,看着withenv
,environment
上面的数组集只是用作一组覆盖。如果environment
字段是不是指定,没有任何内容被覆盖。因此环境必须继承自 Puppet。现在 Puppet 得到什么环境,我不确定,但如果在像 Ubuntu 这样的 Upstart-as-init 系统上作为服务运行,那么至少TERM
和PATH
可用。