【问题标题】:Chef still looking for deleted recipe during chef-client run厨师在厨师客户端运行期间仍在寻找已删除的食谱
【发布时间】:2020-10-13 13:55:37
【问题描述】:

我删除了一个 Chef 食谱,方法是删除食谱 .rb 文件中对其的所有引用,然后上传它所属的食谱:

knife cookbook upload crmpiccoknife cookbook upload crmpicco-deploy

然后我烘焙服务器以提取更改 (chef-client -l error),当我这样做时,我会看到食谱列表中列出的食谱。

chef-client -l error
Starting Chef Client, version 12.19.36
resolving cookbooks for run list: ["ulimit2", "logrotate::global", "users::sysadmins", "apt", "postfix", "redisio", "redisio::enable", "etcd", "apache2", "newrelic::php_agent", "crmpicco-deploy::maintenance", "crmpicco-deploy::enrich", "crmpicco-deploy"]
Synchronizing Cookbooks:
...

配方"crmpicco-deploy::enrich" 是我删除的那个,但由于某种原因它仍然在运行列表中。

由此产生的不可避免的错误是:

Installing Cookbook Gems:
Compiling Cookbooks...

================================================================================
Recipe Compile Error
================================================================================

Chef::Exceptions::RecipeNotFound
--------------------------------
could not find recipe enrich for cookbook crmpicco-deploy

Platform:
---------
x86_64-linux

是否需要运行缓存或其他命令才能强制删除此配方?

【问题讨论】:

  • knife cookbook show crmpicco <version> recipes 是否也显示此食谱enrich.rb?说到版本 - 进行此类更改时更新(并使用新的)食谱版本是个好主意。
  • @Seshadri_C 感谢您的评论。不,当我在本地机器上运行上面的命令时,没有显示配方。是否有某种需要刷新的缓存?

标签: chef-infra ubuntu-16.04 devops


【解决方案1】:

添加这个作为答案,因为它可能需要一些解释。

它可能与 knife node show <nodename> 中显示的 Recipes: 部分相同。

选项 1:

  1. 使用chef-client -o覆盖现有的运行列表:

    chef-client -o "recipe[crmpicco],recipe[crmpicco-deploy]" -l error
    

选项 2:

您可以在“清空”节点的run_list 后尝试运行chef-client。这应该会删除节点的“已保存”Recipes:

  1. 编辑节点:

    knife node edit NODENAME
    
  2. 记下"run_list": 下的配方/角色,删除它们并保存节点,使run_list 为空。

      "run_list": [
    
      ]
    
  3. 运行chef-client,它应该报告节点“有一个空的运行列表”。

  4. 使用以下命令检查节点的 Recipes: 现在是否为空白:

    knife node show NODENAME -a 'recipes'
    
  5. 再次编辑节点并将角色/配方添加回run_list,保存节点。

  6. 运行chef-client -l error

更新:

在进行任何更改时更改/更新说明书版本并在运行中使用更新版本的说明书始终是一个好习惯。它可以确保chef-client 将更新的说明书拉到节点上——在这种情况下,它不会引用丢失的配方文件。

【讨论】:

    【解决方案2】:

    您也必须从运行列表中删除此记录。

    如果您使用 policyfile 来管理运行列表,则需要从该策略中删除配方并将其推送 (chef push) 到 Chef Server。

    如果您在节点属性中设置 run_list(旧方式,在引入策略之前),则运行:

    knife node edit <node>
    

    并从 run_list 中删除配方。

    【讨论】:

      最近更新 更多