如何使用p在Linux VM上执行脚本

时间:2019-06-27 18:26:24

标签: puppet

我需要木偶来执行已安装应用程序内部的脚本。此外,仅当它检测到的较旧版本并且不在特定服务器上时,才需要运行它,然后安装新版本

我尝试了很多东西,但是我迷路了。首先,我尝试使用cd转到脚本所在的位置,然后尝试直接运行脚本,但始终出现相同的错误。

install.pp

# Install required packages
class tripwire::install {

  exec { 'uninstall_tripwire':
    command => './usr/local/tripwire/te/agent/bin/uninstall.sh',
    cwd     => '/usr/local/tripwire/te/agent/bin',
    path    => '/usr/bin/sh',

    onlyif  => [
                  "${::fqdn} != 'server.com'",
                  '/usr/bin/test -f 
/usr/local/tripwire/te/agent/bin/uninstall.sh',
                  "grep -c '8.6.0' /usr/local/tripwire/te/agent/data/version",
      ],
    notify  => Exec['install_tripwire'],

我认为这将执行脚本,但是我得到的只是: 错误:/ Stage [main] / Tripwire :: Install / Exec [uninstall_tripwire]:无法评估:找不到命令“ server.com”

1 个答案:

答案 0 :(得分:2)

  

我需要木偶来执行已安装应用程序内部的脚本。在   另外,只有在它检测到的较旧版本时,我才需要运行   不在特定服务器上,然后安装新版本

您似乎试图用Exec执行的特定任务重复了Package资源的标准行为。实际上,确实应该通过软件包来管理软件,即使您必须自己进行一些打包并维护本地软件包存储库。即使在使用Puppet的情况下,花在包装上的时间也很容易被节省的管理软件所抵消。

此外,就控制运行哪台机器而言,您应该将其视为分类问题。如果该类不应应用于机器server.com,则不应将其声明到该机器的目录中。如果应将它应用于该计算机而不是应用于其他计算机,则应对其进行适当的参数化,并使用这些参数(在分类时,也许借助Hiera)为每个目标计算机选择适当的行为。

尽管如此,关于实际显示的代码,错误消息

  

无法评估:找不到命令“ server.com”

反映出您的onlyif数组的这个元素...

                  "${::fqdn} != 'server.com'",

...不是命令。 onlyif需要一个可以在目标系统上执行的命令或其中的一个数组,所以也许这样:

                  "test ${::fqdn} != server.com",

此外,这看起来是错误的:

    command => './usr/local/tripwire/te/agent/bin/uninstall.sh',

删除前导.,除非您确实打算针对工作目录解析该路径。如果您打算将其解析为相对路径,那么我敦促您改为将其扩展为绝对路径。

此外,这可能不符合您的预期:

    path    => '/usr/bin/sh',

path属性为二进制搜索路径命名,例如PATH环境变量。您可能确实希望指定一个,例如'/bin:/usr/bin:/sbin:/usr/sbin',但是如果您打算输入的内容是要通过shell执行该命令,那么您正在寻找

    provider => 'shell',