使用 Puppet 安装 execSync

Installing execSync using Puppet

我正在编写一个 Puppet 模块来在我们的测试服务器上设置一个应用程序。测试环境要求我们安装一个名为 execSync (https://github.com/mgutz/execSync) 的节点包。由于 execSync 是一个本地包,它在安装时被编译。当我尝试在服务器上手动安装它时,它被安装了。然而,当我使用 Puppet 做同样的事情时,编译步骤失败。

我尝试使用 puppetlabs-nodejs 模块 (https://github.com/puppetlabs/puppetlabs-nodejs) 安装 execSync,并使用 exec 定义的类型和命令 npm install execSync,但似乎没有任何效果。我还检查了是否使用了正确版本的 nodejs 和 npm。

我很想完全自动化这个过程,但似乎没有任何效果,而且我 运行 别无选择。可能的原因是什么?

已编辑:

这是我正在使用的清单:

exec { 'npm-install':
        command => 'npm install execSync',
        cwd => '/var/www/appv3',
        path => '/usr/local/node/node-default/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
        logoutput => true,
}

我 运行 使用 puppet apply

这是我在控制台输出中看到的:

Notice: Compiled catalog for test.app.com in environment production in 0.54 seconds
Notice: /Stage[main]/Main/Exec[npm-install]/returns: npm http GET https://registry.npmjs.org/execSync
Notice: /Stage[main]/Main/Exec[npm-install]/returns: npm http 304 https://registry.npmjs.org/execSync
Notice: /Stage[main]/Main/Exec[npm-install]/returns: npm http GET https://registry.npmjs.org/temp
Notice: /Stage[main]/Main/Exec[npm-install]/returns: npm http 304 https://registry.npmjs.org/temp
Notice: /Stage[main]/Main/Exec[npm-install]/returns: npm http GET https://registry.npmjs.org/rimraf
Notice: /Stage[main]/Main/Exec[npm-install]/returns: npm http 304 https://registry.npmjs.org/rimraf
Notice: /Stage[main]/Main/Exec[npm-install]/returns: npm http GET https://registry.npmjs.org/graceful-fs
Notice: /Stage[main]/Main/Exec[npm-install]/returns: npm http 304 https://registry.npmjs.org/graceful-fs
Notice: /Stage[main]/Main/Exec[npm-install]/returns: 
Notice: /Stage[main]/Main/Exec[npm-install]/returns: > execSync@1.0.2 install /var/www/appv3frontend_testapp.vwo.com/node_modules/execSync
Notice: /Stage[main]/Main/Exec[npm-install]/returns: > node install.js
Notice: /Stage[main]/Main/Exec[npm-install]/returns: 
Notice: /Stage[main]/Main/Exec[npm-install]/returns: [execsync v1.0.2] Attempting to compile native extensions.
Notice: /Stage[main]/Main/Exec[npm-install]/returns: [execSync v1.0.2]
Notice: /Stage[main]/Main/Exec[npm-install]/returns:     Native code compile failed!!
Notice: /Stage[main]/Main/Exec[npm-install]/returns: execSync@1.0.2 node_modules/execSync
Notice: /Stage[main]/Main/Exec[npm-install]/returns: └── temp@0.5.1 (rimraf@2.1.4)
Notice: /Stage[main]/Main/Exec[npm-install]/returns: executed successfully

当我手动 运行 命令时,同样的事情工作得很好。编译成功。

确保在执行 exec 时使用完全限定的路径,例如:

exec {'install-execSync':
  command  => '/usr/local/bin/npm install execSync',
}

为了使用 puppetlabs 模块(你想做的)完全自动化这个过程,我们需要更多信息。

想通了。我一直试图了解两者的不同之处。看来环境不一样了。编译步骤需要设置 HOME 环境变量。未设置时,编译步骤会失败,并且没有任何有用的错误消息。

最后,最终使用了以下清单:

exec { 'npm-install':
        command => 'npm install execSync',
        cwd => '/var/www/appv3',
        path => '/usr/local/node/node-default/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
        environment => ['HOME=/root'],
}