gpt4 book ai didi

ruby - 使用 puppet Factor 返回多个自定义事实

转载 作者:行者123 更新时间:2023-12-04 04:39:34 24 4
gpt4 key购买 nike

我正在尝试将系统上的用户添加为 puppet 事实。我不是 ruby​​ 程序员,下面的代码正确地生成了用户,但他们的 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
}

事实上,这两个 ruby​​ 片段将产生完全相同的结果。

唯一的区别是最后一种方法使用了另一种遍历 passwd 文件的方式。它使用接收参数 user 的闭包作为输入。此 user是唯一 user存在于匿名函数的范围内。

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

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

解决此问题的一种方法是让每个 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

关于ruby - 使用 puppet Factor 返回多个自定义事实,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19127545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com