Ruby 如何从主机名创建自定义:host\u角色事实?
我想根据主机名前缀创建一个角色,但遇到了一些问题。Ruby对我来说是新事物,尽管我已经对解决方案进行了广泛的搜索,但我仍然感到困惑 主机名如下所示:Ruby 如何从主机名创建自定义:host\u角色事实?,ruby,puppet,hostname,facter,Ruby,Puppet,Hostname,Facter,我想根据主机名前缀创建一个角色,但遇到了一些问题。Ruby对我来说是新事物,尽管我已经对解决方案进行了广泛的搜索,但我仍然感到困惑 主机名如下所示: work-server-01 home-server-01 以下是我写的: require 'facter' Facter.add('host_role') do setcode do hostname_array = Facter.value(:hostname).split('-') first_in_array = hos
- work-server-01
- home-server-01
require 'facter'
Facter.add('host_role') do
setcode do
hostname_array = Facter.value(:hostname).split('-')
first_in_array = hostname_array.first
first_in_array.each do |x|
if x =~ /^(home|work)/
role = '"#{x}" server'
end
role
end
end
我想在我的角色分配中使用变量插值,但我想在使用case语句时加上“when”是不正确的。请记住我是Ruby的新手
有人会对我如何实现目标有什么想法吗?模式匹配主机名事实
以下是对您的代码进行的相对枯燥的重构:
require 'facter'
Facter.add :host_role do
setcode do
location = case Facter.value(:hostname)
when /home/ then $&
when /work/ then $&
else 'unknown'
end
'%s server' % location
end
end
通常,它只是查找正则表达式匹配项,并将匹配项的值赋给location,然后将其作为格式化字符串的一部分返回
在我的系统上,主机名与“home”或“work”都不匹配,因此我正确地得到:
Facter.value :host_role
#=> "unknown server"
事实上,您不应该这样做——如果安全性对您来说是一个问题,那么绝对不应该这样做。您可以在
site.pp
中执行匹配,并在此处声明$::host_role
变量。这似乎比我的解决方案优雅得多。我假设“%s服务器“%location”是基于location case语句中的“$&”进行插值的?“%s服务器“%location
大致相当于“{location}server”
,在这个特定实例中,两者是可互换的。位置变量被设置为case表达式的返回值。啊,感谢您的澄清。您能否简要解释一下“when”语句末尾的“$&”在做什么?非常感谢您的帮助。@MikeReed$&
保留最后一次成功的匹配,如果匹配失败,则保留零。有关此类变量的更完整列表,请参阅或。