如何用Puppet和ruby打印所有linux用户?

时间:2015-07-30 18:50:09

标签: ruby puppet facter

我想创建一个返回所有用户的facter。

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]

然后它崩溃,因为下一个字母也是“o”(两个在“root”中,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
...
...

所以它似乎仍然无法正常工作。

3 个答案:

答案 0 :(得分:2)

这是你想要的比赛。

line.match(/^[^:]+/).to_s

当您添加[0]时,它将从字符串中获取用户名的第一个字符。

修改

File.readlines('/etc/passwd').collect do |line|
        line.match(/^[^:]+/).to_s
end

这将收集一个在你的setcode中返回的数组。

答案 1 :(得分:1)

解析$page_size = ceil($item_count/2); 是解决问题的一种笨重方法。

使用Etc module

更干净
/etc/passwd

答案 2 :(得分:1)

使用以下ruby代码,该代码从/ etc / passwd文件中读取并打印用户名。

IO.readlines("/etc/passwd").each do |val|
        user = val.split(":").first
        puts user
end