我有一个厨师服务器pipe理less数节点。 服务器有食谱和数据袋子与各种各样的秘密。 我想对其中一个配方进行更改并仅在单个节点上进行testing:我不希望其他节点更新并使用修改过的配方。
我已经探索的解决scheme:
testing厨房等
testing是很好的,但有一些细节,我不能testing没有数据包和其他东西独特的厨师服务器。
rsync代码到/ var / chef / cache / cookbooks
并运行chef-client --skip-cookbook-sync
这失败了,因为我的食谱源代码缺乏一个metadata.json和各种其他的东西。
碰上食谱版本,上传,编辑节点的运行列表
这很难协调多个开发人员之间的并行工作(特别是如果testing持续数天或数周)。 还有一些我不能控制的环境,我不能假设他们都被locking到我想修改的特定版本的食谱上。
重命名食谱,上传到服务器,应用备用angular色到节点
这是我现在使用的解决scheme。 这是很乏味的,因为改变菜谱名称会改变它定义的任何资源的名称,所以我必须编辑相当多的菜谱。 维护替代angular色集使用改名食谱也是一个烦恼。
我已经通过将cookbook的版本设置为类似于0.0.1的types并将目标环境locking到该版本来解决这个问题 – 这样可以避免导致每个拥有解锁环境的人都采用新的Cookbook。
如果你需要它是一个真正的特定节点,你可以创build一个虚拟的食谱,“依赖”你的特定的0.0.1食谱,并将该食谱分配给一个节点的额外的运行列表条目。 只要环境允许更老的食谱(即<= xyz而不是= xyz),那么它会强制这个节点使用特殊的食谱。
另外,看看testing厨房+厨师零,以testing厨房内的服务器function。
如果你的testing真的持续了几个星期,你可能会考虑应用软件工程领域的成功想法,比如Feature Toggles 。 这样,您可以使用通过angular色属性或Chef中的标签实现的切换旧/新代码。
然而,我们也时不时翻转特定节点的环境,并限制生产到latest - 1版本latest - 1 ,我目前正在尝试以下方法,以简化多个使用相同设置的环境(不保证它是真的运作良好,我还没有在生产中尝试过):
# environments/production.rb name "production" env_cookbook_versions = { "mysql" => "<= 6.0.18", "extra-constrained" => "= 1.1.2" } env_default_attributes = {} eval File.read("production_settings.rb")
这个文件(我通过knife environment from file上传)包含一些特定的约束条件,不适用于其他环境,如pre-production ,即没有extra-constrained食谱版本引脚。
最后, production_settings.rb (所有这些环境之间的共同部分(对于我来说,我只是讲production和pre-production ,不多))可以看起来像这样:
# environments/production_common.rb env_cookbook_versions["foo"] = "= 0.0.1" cookbook_versions(env_cookbook_versions) env_default_attributes.merge!({ "rabbitmq" => { "server" => "mq.example.org" }, "base" => { "flags" => { "production" => true } } }) default_attributes(env_default_attributes)
如你所知,在search同一环境中的其他节点时,必须小心。 而且,我不完全确定,如果所有这些实际上运作良好。 一旦这个改变,你必须确保每个依赖于production_settings.rb环境都是上传的。 但也许这给你一些想法。
顺便说一句。 关于没有厨师服务器的可testing性:我很less遇到不能用testing厨房testing的东西。 你知道吗,你也可以添加数据包和其他假节点到你的食谱来testing使用这样的search查询的代码?