Chef运行converge报cookbook未定义`nssm`方法错误如何解决?
错误根因
- Chef抛出
undefined method 'nssm'错误的核心原因是:你通过Chocolatey安装的只是nssm软件本身,但Chef核心资源库没有内置nssm配置资源。你代码中调用的nssm自定义资源来自社区维护的nssm专用Cookbook,你没有在自己的Cookbook依赖中引入该Cookbook,导致Chef无法识别该资源方法。
解决方案
方案1:引入nssm Cookbook(推荐)
- 在你的Cookbook根目录下的
metadata.rb文件中添加依赖声明:
depends 'nssm', '~> 6.0'
- 如果你使用Berkshelf管理Cookbook依赖,在
Berksfile中添加对应拉取规则,确保依赖的nssm Cookbook能被正常拉取。 - 如果使用Chef Server,将nssm Cookbook和你自己的业务Cookbook一同上传到Server;如果使用chef-solo/chef-apply,确保nssm Cookbook存放在本地Cookbook加载路径中。
- 重新执行chef converge即可,你现有的
nssm资源块写法符合要求,无需修改。
方案2:直接调用nssm命令行(无需引入第三方Cookbook)
如果你不想额外引入第三方Cookbook,可以直接用execute资源调用本地已安装的nssm命令完成服务配置,示例代码如下:
# 安装JMeter服务 execute 'install jmeter service' do command 'nssm install jmeter_service "C:\ProgramData\chocolatey\lib\jmeter\tools\apache-jmeter-5.2.1\bin\jmeter-server.bat"' not_if 'nssm status jmeter_service', returns: [0, 3] end # 配置服务工作目录 execute 'set jmeter service AppDirectory' do command 'nssm set jmeter_service AppDirectory "C:\ProgramData\chocolatey\lib\jmeter\tools\apache-jmeter-5.2.1\bin"' not_if 'nssm get jmeter_service AppDirectory | findstr "C:\\ProgramData\\chocolatey\\lib\\jmeter\\tools\\apache-jmeter-5.2.1\\bin"' end # 配置标准输出日志路径 execute 'set jmeter service AppStdout' do command 'nssm set jmeter_service AppStdout "C:\ProgramData\chocolatey\lib\jmeter\tools\apache-jmeter-5.2.1\bin\output.log"' not_if 'nssm get jmeter_service AppStdout | findstr "C:\\ProgramData\\chocolatey\\lib\\jmeter\\tools\\apache-jmeter-5.2.1\\bin\\output.log"' end # 配置标准错误日志路径 execute 'set jmeter service AppStderr' do command 'nssm set jmeter_service AppStderr "C:\ProgramData\chocolatey\lib\jmeter\tools\apache-jmeter-5.2.1\bin\error.log"' not_if 'nssm get jmeter_service AppStderr | findstr "C:\\ProgramData\\chocolatey\\lib\\jmeter\\tools\\apache-jmeter-5.2.1\\bin\\error.log"' end # 启动并设置服务开机自启 service 'jmeter_service' do action [:enable, :start] end
内容的提问来源于stack exchange,提问作者Roshani
相关产品推荐
相关产品推荐

