【问题标题】:Chef not run if on same version如果在同一版本上,厨师不会运行
【发布时间】:2016-08-08 21:56:55
【问题描述】:

我有一本从源代码安装软件包的食谱。版本是 1.0.0,当我运行 chef-client 时,食谱会自动安装。我不希望这种情况发生。我只希望在未安装说明书或版本已更改(例如更改为 1.0.1)时运行此说明书。

我怎样才能做到这一点?

谢谢

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

    这不是 Chef 的工作方式。如果食谱包含在运行列表中,则始终会执行该食谱。

    但是,这不是问题,只要您的食谱是幂等的(仅更改未处于所需状态的内容)。

    编辑:为了让你的代码具有幂等性,这里有一个使用guards的小教程:

    假设您有以下资源,它将名为xyz 的软件安装到/usr/local/xyz-1.0.0(适用于版本 1.0.0):

    execute "compile-xyz" do
      command "./configure && make && make install"
      pwd node['xyz']['download_path']
    end
    

    您可以通过添加not_if 参数检查/usr/local/xyz-1.0.0 的存在来防止执行此操作:

    execute "compile-xyz" do
      command "./configure && make && make install"
      pwd node['xyz']['download_path']
      not_if do ::File.directory?("/usr/local/xyz-#{node['xyz']['version']}/") end
    end
    

    【讨论】:

    • 我知道它将被执行这是我需要的,一旦它意识到这个食谱版本已经安装,我希望它退出。
    • 然后将版本号写入磁盘上的某个文件并在运行期间检查?但我认为你在滥用厨师。您的配方应该以一种可以反复运行的方式构建。
    • 脚本正在从源代码构建程序。为此有一个 debian 软件包,但它将软件包安装到不合适的地方。我需要将它安装到特定位置,因为我有其他依赖它的组件。所以目前我不得不从源代码构建。
    • 没有理由阻止多次编译发生。你只需要guard 否则会做无用工作的资源,例如,使用not_if do ::File.exists?("/usr/local/#{node['foosoftware']['version']}") end。然后你得到幂等性。
    • 很多食谱使用 chef 从源代码构建和安装软件,你应该看看他们使用的模式。他们都不需要运行一次的食谱来完成工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多