【问题标题】:Chef - Search within test kitchen contextChef - 在测试厨房环境中搜索
【发布时间】:2017-06-05 09:08:55
【问题描述】:

我正在管理一些只能在一台服务器上运行的脚本。我已经决定找出分配给给定角色的主机的最佳方法是进行搜索,然后选择返回的数组中的第一个元素。

像这样:

q = "roles:thumper"
arr = search(:node, q, filter_result: { fqdn: ['fqdn'] }).map { |n| n['fqdn'] }

 # => ["1.example", "2.example"]

arr.first 
# "1.example"

这在现实和 chef-shell 中运行良好,但在测试厨房中遇到困难,我在搜索命令中返回 HTTP 500。

     ================================================================================
     Recipe Compile Error in /tmp/kitchen/cache/cookbooks/test/recipes/full.rb
     ================================================================================

     Net::HTTPFatalError
     -------------------
     500 "Internal Server Error"

我将 chef_zero 与 vagrant 驱动程序一起使用。要让搜索功能在这种情况下正常工作,有什么特别需要做的吗?

集成json:

{
  "id": "thumper",
  "environment": "food",
  "run_list": ["role["thumper]"],
  "automatic": {
    "fqdn": "thumper",
    "ipaddress": "10.10.10.10",
    "roles": ["thumper"],
    "environment": "food"
  }
}

夹具数据只是调用相关的说明书

include_recipe 'test_helpers'
include_recipe 'role_thumper'

【问题讨论】:

    标签: chef-infra test-kitchen


    【解决方案1】:

    根本问题可能是您没有正确设置夹具节点数据,或者部分搜索 API 的某些部分在零下无法正常工作。然而,这主要是没有实际意义的,因为这种服务器选举方法是不安全的,你不应该使用它。至少您需要以某种方式对返回的数组进行排序,因为 Chef 中的搜索结果对于任何外部参考点都不稳定(它对名为“对象 ID”的字段进行排序,但这并未在 API 中公开)。更重要的是,这很容易导致服务器被降级,但直到下一次 Chef 运行时才意识到这一点。根据您对“仅在一个地方运行”规则的重视程度,您可能需要在 Chef 端使用一些更牢固的代码,或者更好的是使用实际为集群协调设计的工具,例如 Consul、ZooKeeper 或 Etcd。

    【讨论】:

    • 上面的示例代码有点过于简单,实际上它确实有一些外部排序和基本的完整性检查。不过,好电话。使用 Kubernetes 进行适当的编排将在 2 周内成为我的一个大型黑客马拉松项目,我将听取您的建议,尝试将这种类型的东西集成到那里的服务发现中。同时,虽然我通常希望能够在 TK 中使用搜索(不是部分搜索)。你用夹具节点数据暗示什么?我会把我的 json 放在原来的问题中
    • 您需要为测试实例提供一个 JSON 格式的 Node 对象文件夹,就像您在那里一样,但它位于 test/integration/nodes 中,除非您在 Kitchen 配置中覆盖该文件夹。作为创建过程的一部分,它会被传送到 VM。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多