繁体   English   中英

使用p Facter返回多个自定义事实

[英]Returning multiple custom facts with puppet Facter

我试图将用户添加到系统中作为p事实。 我不是一个红宝石程序员,下面的代码可以正确生成用户,但是他们的uid都是相同的(密码文件中最后一个条目的uid)。 如果uid超出范围,那么我会期望出现未知的符号错误,如果Facter.add在最后只被调用一次,则我希望只有一个用户,最后一个与uid相同。 我不明白一个人如果没有另一个人也不能如此反复...

File.open("/etc/passwd", "r") do |passwords|
  while pw_entry = passwords.gets
    user, pw, uid, gid, gecos, home, shell = pw_entry.split(/:/)

    Facter.add("user_" + user) do
      setcode do
        uid
      end
    end
  end
end

在四处寻找时,我发现其他人几乎有相同的问题,这就是解决方案(对我也很有效):

require 'etc'

Etc.passwd { |user|

    Facter.add("user_" + user.name) {
      setcode {
        user.uid
      }
    }
}

...但是我不明白有什么区别。 它就像对Facter.add块的调用被缓冲并在循环结束时一次运行一样,并且Etc加载了所有passwd,因此user.uid索引进入数组,并且计时无关紧要。 但是,对于程序语言而言,这将是一件奇怪的事情。

您正确地说以下话:

File.open("/etc/passwd", "r") do |passwords|
  while pw_entry = passwords.gets
      user, pw, uid, gid, gecos, home, shell = pw_entry.split(/:/)
      print uid
  end
end

几乎等同于:

require 'etc'
Etc.passwd { |user|
  print uid
}

实际上,这两个红宝石片段将产生完全相同的结果。

唯一的区别是,最后一种方法使用另一种遍历passwd文件的方式。 它使用一个闭包来接收参数user作为输入。 user是匿名功能范围内的唯一user

现在,关于您的两种方法之间的差异问题:

当您在ruby闭包内部引用不属于该闭包本身的变量(即外部变量)时,对该变量的符号在(外部)范围内的引用将存储在闭包的代码内。 由于在第一个方法,你重复使用相同的范围内,同样的符号, uid引用的最后已知值uid时已添加的所有事实后封闭的代码被调用。 这称为外部变量陷阱

解决此问题的一种方法是让每个uid存在于其自己的范围内。

def addUserFact(passwd_entry)
  user, pw, uid, gid, gecos, home, shell = passwd_entry.split(/:/)   
  Facter.add("user_" + user) do
    setcode do
      uid
    end
   end
end

File.open("C:/cygwin/etc/passwd", "r") do |passwords|
  while pw_entry = passwords.gets
    addUserFact(pw_entry)
  end
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM