无法在 Puppet 中使用 exec 命令设置 bash 变量

Can't set a bash variable using exec command in Puppet

提问人:Christian Michael Tan 提问时间:8/4/2023 更新时间:8/4/2023 访问量:86

问:

我正在尝试使用 Puppet 中的 exec 命令在变量中设置 bash 命令的结果:

 exec { 'test':
     command => "test=$(pwd)",
     path =>  [ '/bin/', '/sbin/' , '/usr/bin/', '/usr/sbin/' ],
     logoutput => true,
}

但它给了我一个:

Error: Could not find command 'test=$(pwd)'

对此的解决方案是什么?

linux bash 变量 puppet puppet-enterprise

评论

1赞 M S 8/4/2023
包括provider => 'shell',
0赞 Christian Michael Tan 8/4/2023
这行得通!尽管我试图通过使用测试是一个未知变量来打印结果。访问变量内容的正确方法是什么?echo ${test}

答:

3赞 John Bollinger 8/4/2023 #1

我正在尝试使用 Puppet 中的 exec 命令在变量中设置 bash 命令的结果:

exec { 'test':
     command => "test=$(pwd)",
     path =>  [ '/bin/', '/sbin/' , '/usr/bin/', '/usr/sbin/' ],
     logoutput => true,
}

在 Linux 上,资源的默认提供程序是 。如果您希望通过 shell 执行命令,则需要通过添加Execposix

     provider => 'shell',

但是您不能从这样的 shell 中影响 Puppet 的执行环境,因此您设置的任何环境变量、修改的 shell 选项将仅在该命令的持续时间内生效。例如,您不能以这种方式设置环境变量以供后续使用。Exec

也就是说,这将按预期工作:

# Ok

exec { 'test':
  command   => 'test=$(pwd); echo "${test}"',
  path      => ['/bin', '/sbin' , '/usr/bin', '/usr/sbin'],
  logoutput => true,
  provider  => 'shell',
}

,但这不太可能产生相同的结果:

# Not what you want!

exec { 'set test':
  command   => 'test=$(pwd)',
  path      => ['/bin', '/sbin' , '/usr/bin', '/usr/sbin'],
  logoutput => true,
  provider  => 'shell',
}

exec { 'print test':
  command   => 'echo "${test}"',
  path      => ['/bin', '/sbin' , '/usr/bin', '/usr/sbin'],
  logoutput => true,
  provider  => 'shell',
}

(注意另引用。Puppet 将在双引号字符串中出现的位置展开,可能为零。为避免这种情况,请转义 as 或使用单引号而不是双引号。${test}$\$


目前尚不清楚您的总体目标是什么,因为在资源中捕获的东西并不有用。如果您关心文件的位置,则应通过绝对路径引用它们,除非您可以使用简单的命令名称,这些名称可以针对您在 .pwdExecExec

如果要将变量添加到命令的(相当稀疏的)环境中,那么资源的参数通常是最合适的方法,但不能在那里使用命令替换。但是,您可以插入事实或普通 Puppet 变量的值,这可能是实现您所追求的良好途径。environmentExec

如果要执行一系列复杂的相关 shell 命令,则可以考虑将 shell 脚本编写到目标系统上的文件中,然后执行该脚本。或者寻找一个可以做你想做的事的现有模块,甚至编写一个使用 Ruby(也许还有下面的 shell 命令)来执行的自定义资源类型。