bash中从ruby数组到json
在我的厨师环境中,我有这样一个变量:bash中从ruby数组到json,ruby,bash,chef-infra,Ruby,Bash,Chef Infra,在我的厨师环境中,我有这样一个变量: "repl_set_members": ["tmongo01", "tmongo02", "tmongo03"] config = "{_id: '<%= @repl_set_name %>', members: [ <% @members.each_with_index do |name,number| %> {_id: <%= "#{number}" %>, host: '<%= "#{name}" %>
"repl_set_members": ["tmongo01", "tmongo02", "tmongo03"]
config = "{_id: '<%= @repl_set_name %>', members: [
<% @members.each_with_index do |name,number| %>
{_id: <%= "#{number}" %>, host: '<%= "#{name}" %>:27017'},
<% end %>
] }"
mongo localhost:27091 --eval "JSON.stringify(db.adminCommand({'replSetInitiate' : $config}))"
我需要创建要发送到Mongo实例的JSON并构建副本集
我使用以下模板创建了一个bash文件:
template "/opt/create_repl_set.sh" do
source "create_repl_set.sh.erb"
owner 'root'
group 'root'
mode "0755"
variables(
:repl_set_name => node['mongodb']['shardname'],
:members => node['mongodb']['repl_set_members']
)
end
在bash模板中,我会有如下内容:
"repl_set_members": ["tmongo01", "tmongo02", "tmongo03"]
config = "{_id: '<%= @repl_set_name %>', members: [
<% @members.each_with_index do |name,number| %>
{_id: <%= "#{number}" %>, host: '<%= "#{name}" %>:27017'},
<% end %>
] }"
mongo localhost:27091 --eval "JSON.stringify(db.adminCommand({'replSetInitiate' : $config}))"
config=“{u id:”,成员:[
{{u id:,主机:':27017'},
] }"
MongoLocalHost:27091--eval“JSON.stringify(db.adminCommand({'replSetInitiate':$config})”
但是结果JSON包含了最后一个逗号,我不知道如何去掉它
有谁有更好的主意吗?删除最后一个逗号的一种快速而肮脏的方法是使用bash字符串操作并按如下方式调用脚本:
mongo localhost:27091 --eval "JSON.stringify(db.adminCommand({'replSetInitiate' : ${config/%,/}))"
请注意,这将始终删除JSON值中的最后一个逗号,因此只有当生成的JSON始终有一个额外的逗号时(即,即使JSON为空)删除最后一个逗号的快速而肮脏的方法是使用bash字符串操作并按如下方式调用脚本时,此方法才会起作用:
mongo localhost:27091 --eval "JSON.stringify(db.adminCommand({'replSetInitiate' : ${config/%,/}))"
请注意,这将始终删除JSON值中的最后一个逗号,因此只有当生成的JSON始终有一个额外的逗号(即,即使JSON为空)时,它才会起作用。您可能需要的是
执行资源和。\u JSON
mongo_cmd = {
'replSetInitiate' => {
'_id' => node['mongodb']['shardname'],
'members' => node['mongodb']['repl_set_members'].each_with_index.map { |name, number|
{'_id' => number, 'host' => "#{name}:27017"}
},
},
}
execute "mongo localhost:27091 --eval 'JSON.stringify(db.adminCommand(#{mongo_cmd.to_json}))'"
您可能需要的是一个execute
资源和一个.to_json
mongo_cmd = {
'replSetInitiate' => {
'_id' => node['mongodb']['shardname'],
'members' => node['mongodb']['repl_set_members'].each_with_index.map { |name, number|
{'_id' => number, 'host' => "#{name}:27017"}
},
},
}
execute "mongo localhost:27091 --eval 'JSON.stringify(db.adminCommand(#{mongo_cmd.to_json}))'"
不要像那样手工创建JSON。使用Ruby的内置JSON类,将数组或哈希传递给它,并让它生成JSON。格式比你想象的要复杂得多,经过良好测试的JSON类知道该做什么。不要像那样手工创建JSON。使用Ruby的内置JSON类,将数组或哈希传递给它,并让它生成JSON。格式比您想象的要复杂得多,经过良好测试的JSON类知道该做什么。@theTinMan您是对的。这就是为什么我要一个更好的主意。不幸的是,我不精通Ruby。你能举个例子,给我指出正确的方向吗?非常感谢。我想你是想回复上面的评论,但我这里有一个例子给你…我照你说的做了。它起作用了。非常感谢。同时,我想看一个锡人所说的例子。同样的,我只是向你展示了使用to_json而不是json模块方法。@theTinMan你是对的。这就是为什么我要一个更好的主意。不幸的是,我不精通Ruby。你能举个例子,给我指出正确的方向吗?非常感谢。我想你是想回复上面的评论,但我这里有一个例子给你…我照你说的做了。它起作用了。非常感谢。同时,我想看一个铁皮人所说的例子。这是一样的,我只是向你展示了使用to_json而不是json模块方法。这并不是真的相关。@coderanger在某种程度上是,它不处理JSON的生成方式,但它允许OP通过删除额外的逗号将错误的JSON转换为有效的JSON。@coderanger在某种程度上,它是这样的,它不处理JSON的生成方式,但它允许OP通过删除额外的逗号将错误的JSON转换为有效的JSON