我想创建一个返回所有用户的因子。
Facter.add("sysusers") do
setcode do
File.readlines('/etc/passwd').each do |line|
line.match(/^[^:]+/)[0]
end
end
end
然后在我的.pp
文件中,我有这个:
$users = inline_template("<%= scope.lookupvar('sysusers') %>")
$users.each |String $user| {
notify { "$user":}
}
这应该可以工作,但是因子一次只返回一个字母。
所以notify { "$user":}
只打印:
Notify[r]
Notify[o]
然后它崩溃了,因为下一个字母也是"0"("root"中有两个0,而root是/etc/passwd中规定的第一个用户)。
那么如何打印所有用户呢?
编辑
编辑到:
Facter.add("sysusers") do
setcode do
File.readlines('/etc/passwd').each do |line|
line.match(/^[^:]+/).to_s
end
end
end
则输出为:
root@mymachine]# facter sysusers
[
"root:x:0:0:root:/root:/bin/bash
",
"bin:x:1:1:bin:/bin:/usr/bin/nologin
",
"daemon:x:2:2:daemon:/:/usr/bin/nologin
...
...
所以它似乎仍然没有像预期的那样工作。
这就是你想要的匹配。
line.match(/^[^:]+/).to_s
当您添加[0]时,它将从字符串中取第一个字符作为用户名。
编辑File.readlines('/etc/passwd').collect do |line|
line.match(/^[^:]+/).to_s
end
将收集一个数组,该数组将在setcode中返回。
解析/etc/passwd
是解决问题的笨拙方法。
使用Etc模块更简洁
require 'etc'
result = []
Etc.passwd { |user| result << user.name }
result
使用以下ruby代码,读取并打印/etc/passwd文件中的用户名。
IO.readlines("/etc/passwd").each do |val|
user = val.split(":").first
puts user
end