[英]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.