2015-07-30 2 views
2

Я хочу создать фактору, который возвращает всех пользователей.Как распечатать всех пользователей Linux с помощью Puppet и ruby?

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":} 
} 

Это должно работать, но facter возвращается только одна буква в то время.

Так notify { "$user":} просто печатает:

Notify[r] 
Notify[o] 

А потом craches, потому что следующая буква также «о» (два o`s в «корень» и корень заявил первый пользователь в/и т.д./пароль).

Итак, как я могу распечатать всех пользователей?

EDIT
С правкой:

Facter.add("sysusers") do 
    setcode do 
    File.readlines('/etc/passwd').each do |line| 
     line.match(/^[^:]+/).to_s 
    end 
    end 
end 

Тогда выход:

[email protected]]# 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 
... 
... 

Так что до сих пор, кажется, не работает, как expeced.

ответ

2

Это матч, который вы хотите.

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

Когда вы добавляете [0], он берет первый символ из строки, которая является именем пользователя.

EDIT

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

Это будет собирать массив, который будет возвращен в вашем setcode.

+0

Спасибо, но это все еще не работает. Посмотрите, пожалуйста, мое редактирование. – Rox

1

Parsing /etc/passwd - неуклюжий подход к вашей проблеме.

Это очиститель использовать Etc module

require 'etc' 
result = [] 
Etc.passwd { |user| result << user.name } 
result 
1

Используйте следующий рубиновый код, который считывает и выводит имена пользователей из/и т.д./пароль файл.

IO.readlines("/etc/passwd").each do |val| 
     user = val.split(":").first 
     puts user 
end 
Смежные вопросы