Puppet的环境从哪里来?

Puppet的环境从哪里来?

自我训练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为提供者。进一步地,看着withenvenvironment上面的数组集只是用作一组覆盖。如果environment字段是不是指定,没有任何内容被覆盖。因此环境必须继承自 Puppet。现在 Puppet 得到什么环境,我不确定,但如果在像 Ubuntu 这样的 Upstart-as-init 系统上作为服务运行,那么至少TERMPATH可用。

相关内容