【问题标题】:Chef template loop ruby厨师模板循环红宝石
【发布时间】:2017-06-20 16:18:31
【问题描述】:

我有 json 文件作为环境文件导入厨师,

    { 
    "mongodb": {
      "replicaset": {
        "nodes": [
          "test-mongo1:27017",
          "test-mongo2:27017"
        ]
      }
    }
}

我添加了如下厨师食谱模板来构建 mongo 连接字符串,

"mongo": {
    "url" : "mongodb://<% node['mongodb']['replicaset']['nodes'].each do |replica| -%>admin:123456@<%= replica %>/user_db1",
<% end %>

但是像下面这样的输出并且没有作为 JSON 验证

"mongo": {
"url" : "mongodb://admin:123456@test-mongo1:27017/user_db1",
admin:123456@test-mongo2:27017/user_db1",

预期结果:

"mongo": {
"url" : "mongodb://admin:123456@test-mongo1:27017/user_db1,admin:123456@test-mongo2:27017/user_db1",

已关注How to Run for each loop in template chef,但我的 ruby​​ 并不是最好的,因为我刚刚开始接触所有这些东西。任何帮助都会很棒,谢谢。

【问题讨论】:

  • 使用map 而不是each

标签: ruby chef-infra


【解决方案1】:

首先,我们可以尝试修复循环,以便仅将必要的部分包含在内部块中:

"mongo": {
    "url" : "mongodb://<% node['mongodb']['replicaset']['nodes'].each do |replica| -%>admin:123456@<%= replica %>/user_db1,<% end %>",

然而这仍然会导致一个问题:有一个尾随逗号,因为我们总是在每次迭代之后添加它。

因此,更好的方法是首先构建一个 URL 列表,然后用逗号将它们连接到单个字符串。这样,元素之间只添加了一个逗号。这应该可以代替:

"mongo": {
    "url" : "mongodb://<%= node['mongodb']['replicaset']['nodes'].map { |replica| "admin:123456@#{replica}/user_db1" }.join(",") %>",

基本上,这段代码的作用如下:

output = ""

output << "\"mongo\": {\n"
output << "    \"url\" : \"mongodb://"
urls = node['mongodb']['replicaset']['nodes'].map do |replica|
  output << "admin:123456@"
  output << replica
  output << "/user_db1"
end
output << urls.join(", ")
output << "\","

这里,output 表示 ERB 模板的输出。在实际的 ERB 实现中,涉及到的逻辑要多一些,但基本逻辑是类似的。

在实际的食谱中执行此操作时,通常更好的方法是在您的食谱中构建 URL,并将它们传递给您的模板预构建:

recipes/default.rb:

urls = node['mongodb']['replicaset']['nodes'].map do |replica| 
  "admin:123456@#{replica}/user_db1"
end

template '/path/to/mongo.json' do
  source 'my_template.json.erb'
  variables mongo_urls: urls
end

templates/default/my_template.json.erb:

"mongo": {
    "url" : "mongodb://<%= @mongo_urls.join(",") %>",

【讨论】:

  • 感谢您帮助我。但输出仍然不如预期。 "url" : "mongodb://admin:123456@test-mongo1:27017/user_db1admin:123456@test-mongo2:27017/user_db1", 不是用逗号分隔的。
  • 已解决,感谢您的帮助 :),将研究预构建并将其包含到模板中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
  • 2010-10-22
相关资源
最近更新 更多