#deri :: https:0x0000000404f3b8>的未定义方法`gsub'

时间:2017-06-21 05:42:12

标签: ruby chef chef-recipe

我正在尝试在用户输入的url上使用Http :: get请求。在一个食谱中,我有网址“https://company.in.example.net:port/ha”。此配方打印可用的子网。用户将选择子网并将其作为输入。假设用户给出了“100.1.100.1”,那么我需要将它附加到现有的url并对其执行http :: get操作。所以新的网址应该是“https://company.in.example.net:port/ha/100.1.100.1”我写了以下脚本。

url = 'https://company.in.example.net:port/ha/'
ruby_block 'run_my_template_resource' do
   action :create
   block do
     puts "Enter subnet: "
     input = gets
     url = url + input
     puts url
     uri =  URI.parse(URI.encode(url.to_s))
     r = Chef::Resource::Template.new('default',run_context)
     r.path       '/etc/app.conf'
     r.source     'app.conf.erb'
     r.cookbook   'testbook'
     r.owner      'root'
     r.group      'root'
     r.mode       00600
     r.variables({
     my_id: Chef::HTTP.new(uri).get('/',{ 'user-principal' => 
 '{"userName":"user","password":"pass"}', 'Accept' => 'application/json', 
 'Content-Type' => 'application/json' })
    })
     r.run_action :create
   end
 end

这里将url打印正确的url。当我运行食谱时,我收到错误NoMethodError: undefined method gsub'for #`任何帮助都将受到高度赞赏。 谢谢:))

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。

首先,您获得URI::InvalidURIError: bad URI(is not URI?),因为您传递的内容不是语义上有效的URI。

url = 'https://company.in.example.net:port/ha/'

我怀疑您没有用实际端口号替换:port

其次,您在不删除尾随空格的情况下接收用户输入。你应该把你的行读作:

input = gets.chomp

否则您的输入会有一个尾随\n,从而为您提供无效的URI。

第三,如果您收到gsub错误是因为Chef可能希望收到String,而不是URI对象。您可以轻松地将URI转换为字符串,如下所示:

Chef::HTTP.new(uri.to_s)