我正在尝试在用户输入的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 #`任何帮助都将受到高度赞赏。
谢谢:))
答案 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)