如何查询节点上的食谱版本?

How to query cookbook versions on a node?

用例: DevOps 团队前段时间启动了一个节点,我的团队想知道 run_list 中使用的 one/several 食谱的版本是什么。 我们的 DevOps 团队正在救火,所以我们想找到一种自给自足的方法。

尝试的命令: knife cookbook show COOKBOOK 给出了所有可能的版本,但没有指定使用的是哪一个。

knife node show NODE 显示所有食谱,但没有附加版本信息。

问题:是否有命令(类似knife searchohai的东西)查询节点上部署的版本的厨师服务器?

如果您可以通过 ssh 进入该框,您可以在 /var/chef/cache/cookbooks/<cookbook name>/metadata.json 下查找版本。

此外,您可以在主厨 运行 期间访问它,方法是查看 @run_context.cookbook_collection,但这可能无济于事。

通常,说明书版本由环境定义,但由于环境随时间而变化,您不能真正相信它与此节点上次收敛时使用的是同一组(尤其是已经有一段时间了) .

到目前为止,最安全的选择是查看 chef 缓存。

我可以想到一个两步解决方案。

第 1 步:knife 节点显示 <%node-name%>。输出应包括节点上正在使用的环境。

第 2 步:knife 环境显示 <%environment-name%>。此输出应详细说明正在节点上部署的所有说明书及其版本

在我们的组织中,我们使用基本说明书在具有说明书版本的节点上设置属性。

run_context.cookbook_collection.each do |key, cookbook|
  node.set['base_cookbook']['cookbook_versions'][cookbook.name] = cookbook.version
end

然后我们可以通过

查询节点使用的版本
knife node show <node-name> -a base_cookbook.cookbook_versions

我不确定通过 knife 的方式,但您可以在 https://manage.chef.io 登录您的 Managed Chef,然后导航到您组织的节点部分。单击有问题的节点名称,然后在右下角 Run List 下单击 Expand All link。这将向您显示每个食谱的食谱版本 运行 as.

遇到这个 post 并最终制定了一个 grep 命令来执行此操作。

sudo grep -o -e '\"version\"\:\"[a-zA-Z0-9.]*\"' -e '\"version\"\: \"[a-zA-Z0-9.]*\"' /var/chef/cache/cookbooks/*/metadata.json

如果您正在使用 ohai(您可能正在使用),您可以这样做:

knife search -i 'cookbooks:your-cookbook' -a cookbooks.your-cookbook.version

这将为您提供显示主机名和说明书版本的输出:

1 items found

server.name.example:
  cookbooks.cs-redis.version: 0.3.2

我正在为 Windows 个客户使用这个(和的版本)

Invoke-Command -ComputerName $nodename -ScriptBlock { gci "c:\chef\cache\cookbooks\*\metadata.rb"  | % { select-string $_ -pattern '^version.*$' } | % { $_.Path.replace('\metadata.rb','') } } -Credential $creds

我有一个类似的要求,我发布了一个新版本的说明书,并想找到哪些节点正在使用我的最新版本的说明书。下面的刀命令对我有用。

knife search -i node "cookbooks:<cookbook-name> AND cookbooks_<cookbook-name>_version:100.1.0"