我在一些服务器上安装了一个小应用程序,我想写一个快速配方,让我从这些服务器收集版本号。
这是我写的:
bash "Get app version" do code <<-EOH cat /var/lib/myapp/node_modules/myapp/package.json | grep version EOH end
但是,当我运行knife bootstrap命令,我没有看到我的控制台中的输出,即使我用-VV运行它的输出不存在。
我有两个问题:
cat结果不出现在我的控制台? 将版本号保存为节点属性 。 这样你就有了一个中央存储的版本,你可以很容易地在主厨其他地方使用节点属性。
就像是:
ruby_block "myapp installed version check" do block do # file setup file = "/var/lib/myapp/node_modules/myapp/package.json" raise "File doesn't exist [#{file}]" unless File.exists?( file ) # get the version line versions = open( file ).grep(/version/) raise "No versions in file [#{file}]" unless versions.length > 0 Chef::Log.warn "Too many versions [#{versions.length}] in file [#{file}]" unless versions.length == 1 # some regex to match your version number version = versions[0].match(/\d+\.\d+/).to_s # set the attribute node.set[:installed][:myapp][:version] = version # optionally reload node so attribute is available during this chef-client run node.from_file( run_context.resolve_attribute('myapp-cookbook', 'default') ) # and log it. Chef::Log.info( "myapp version is [#{node[:installed][:myapp][:version]}]" ) end end
主厨将会失败,除非有例外。 使用Chef::Log并return错误是不重要的,你想继续处理食谱。
您可以删除节点属性位,只logging信息,使其出现在厨师 – 客户端日志中。 这比依靠stdout / stderr更好一些,当chef-client没有以交互方式运行(即作为服务)时,stdout / stderr会消失。 但是,为什么只要将它存储在中心位置并且查询下面的值,就可以logging下来?
注意在库中实现ruby通常更好,如果你曾经想过要使用myapp-b的特性,通过自定义的轻量级资源来使用它。
首先,要查看刀输出中的输出,可能需要将stdout输出redirect到stderr ,这与通常习惯用法相反:
cat /var/lib/myapp/node_modules/myapp/package.json | grep version 1>&2
但是如果你只是使用ssh (或者用像dsh这样的工具发布的)来运行你的原始命令而不是刀子,那么你将得到你想要的输出,而不需要额外的刀片输出。
至于收集数据的“最佳方法”,完全取决于你想要使用的数据。 如果只是提供信息,并且希望在进行手动引导操作时看到它,那么以这种方式使用刀就可以。 但是,如果你想系统地处理数据,比如收集数据并在另一个程序中使用,那么使用刀子不可能是最好的方法。