【问题标题】:Returning multiple custom facts with puppet Facter使用 puppet Factor 返回多个自定义事实
【发布时间】:2013-10-08 06:48:07
【问题描述】:

我正在尝试将系统上的用户添加为傀儡事实。我不是 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 索引到数组中并且时间无关紧要。但是,对于程序语言来说,这将是一件奇怪的事情......

【问题讨论】:

    标签: ruby puppet facter


    【解决方案1】:

    你说得对:

    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​​ sn-ps 会产生完全相同的结果。

    唯一的区别是最后一个方法使用了另一种遍历 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
    

    【讨论】:

      猜你喜欢
      • 2017-10-11
      • 2018-12-03
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 2021-12-17
      • 2021-09-03
      相关资源
      最近更新 更多