Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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
Ruby 如何从主机名创建自定义:host\u角色事实?_Ruby_Puppet_Hostname_Facter - Fatal编程技术网

Ruby 如何从主机名创建自定义:host\u角色事实?

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

我想根据主机名前缀创建一个角色,但遇到了一些问题。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 = 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
$&
保留最后一次成功的匹配,如果匹配失败,则保留零。有关此类变量的更完整列表,请参阅或。