Получить массив строк из Facter в Puppet - PullRequest
0 голосов
/ 03 июля 2018

В модуле, над которым я работаю, мне нужно проверить, существуют ли определенные пользователи на машине. Идея заключалась в том, чтобы создать пользовательский факт, содержащий массив всех пользователей. В модуле он должен выполнять итерацию по массиву и проверять, является ли конкретный пользователь частью массива.

Мой пользовательский факт:

Facter.add("users") do
  setcode do
    IO.readlines("/etc/passwd").collect do |line|
      line.split(":").first
    end
  end
end

Вывод факта - это строка типа: ["user1", "user2", "user3"]

Поскольку это просто строка, а не массив, я не могу перебрать ее в своем модуле puppet.

Я тогда попробовал

  shell_split($::users).each |String $user| {
    notify { "$user":}
  }

Но теперь каждый пользователь содержит запятую после имени пользователя.

У вас есть идея для рабочего и лучшего решения?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вывод факта представляет собой строку типа: ["user1", "user2", "user3"]

Нет, это не так. Код Ruby, представленный вами в блоке факта setcode, оценивается как массив. Это выражение обеспечивает ценность факта. Это массив.

Возможно, однако, что Puppet преобразует этот массив в строку после получения его от Facter. Puppet 3 делал это по умолчанию, но имел логический параметр конфигурации stringify_facts, который мог предотвратить такое поведение. Puppet 4 сохранил этот параметр, но устарел и изменил его значение по умолчанию (до false). Puppet 5 удалил настройку и никогда не строковые значения фактов.

Поэтому, если вы используете (устаревшую) Puppet 3, вы можете избежать строкового преобразования фактов, установив

stringify_facts = false

в разделе [main] ваших файлов puppet.conf на ведущем устройстве и всех агентах. Вы можете сделать то же самое в Puppet 4, но там вы также можете просто убедиться, что параметр stringify_facts не установлен явно.

0 голосов
/ 03 июля 2018

Предполагается, что вы получите это как Factor.add:

output = '["user1", "user2", "user3"]'

Вы можете преобразовать его в Array с помощью JSON:

require 'json'

JSON.parse output
 => ["user1", "user2", "user3"] 
...