Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash中从ruby数组到json_Ruby_Bash_Chef Infra - Fatal编程技术网

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