gpt4 book ai didi

ruby - Chef 模板循环 ruby

转载 作者:太空宇宙 更新时间:2023-11-03 18:06:20 24 4
gpt4 key购买 nike

我有 json 文件作为环境文件导入到 Chef ,

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

我添加了如下的 chef cookbook 模板来构建 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 并不是最好的,因为我才刚刚开始使用所有这些东西。任何帮助都会很棒,谢谢。

最佳答案

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

"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实现中,逻辑有点多,但基本逻辑与此类似。

在实际的 Recipe 中执行此操作时,通常更好的方法是已经在您的 Recipe 中构建 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(",") %>",

关于ruby - Chef 模板循环 ruby ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44631843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com