提问人:Christian Michael Tan 提问时间:8/4/2023 更新时间:8/4/2023 访问量:86
无法在 Puppet 中使用 exec 命令设置 bash 变量
Can't set a bash variable using exec command in Puppet
问:
我正在尝试使用 Puppet 中的 exec 命令在变量中设置 bash 命令的结果:
exec { 'test':
command => "test=$(pwd)",
path => [ '/bin/', '/sbin/' , '/usr/bin/', '/usr/sbin/' ],
logoutput => true,
}
但它给了我一个:
Error: Could not find command 'test=$(pwd)'
对此的解决方案是什么?
答:
我正在尝试使用 Puppet 中的 exec 命令在变量中设置 bash 命令的结果:
exec { 'test': command => "test=$(pwd)", path => [ '/bin/', '/sbin/' , '/usr/bin/', '/usr/sbin/' ], logoutput => true, }
在 Linux 上,资源的默认提供程序是 。如果您希望通过 shell 执行命令,则需要通过添加Exec
posix
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}
$
\$
目前尚不清楚您的总体目标是什么,因为在资源中捕获的东西并不有用。如果您关心文件的位置,则应通过绝对路径引用它们,除非您可以使用简单的命令名称,这些名称可以针对您在 .pwd
Exec
Exec
如果要将变量添加到命令的(相当稀疏的)环境中,那么资源的参数通常是最合适的方法,但不能在那里使用命令替换。但是,您可以插入事实或普通 Puppet 变量的值,这可能是实现您所追求的良好途径。environment
Exec
如果要执行一系列复杂的相关 shell 命令,则可以考虑将 shell 脚本编写到目标系统上的文件中,然后执行该脚本。或者寻找一个可以做你想做的事的现有模块,甚至编写一个使用 Ruby(也许还有下面的 shell 命令)来执行的自定义资源类型。
评论
provider => 'shell',
echo ${test}