ユーザーを人形の事実としてシステムに追加しようとしています。私は ruby プログラマーではありません。次のコードは適切にユーザーを生成しますが、ユーザーの uid はすべて同じです (パスワード ファイルの最後のエントリの uid)。uid が範囲外の場合、未知のシンボル エラーが発生することが予想されます。Facter.add が最後に 1 回だけ呼び出された場合、uid と同じ、最後のユーザーが 1 人しか存在しないことが予想されます。他の人もそうせずに反復する方法がわかりません...
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 インデックスとタイミングは関係ありません。それは手続き型言語にとって奇妙なことですが...