Как получить факт и использовать его для хранения пользовательского значения в переменной в Puppet?

У меня есть сценарий, в котором я получаю IP-адрес от компьютера, а затем выполняю некоторые логические операции, чтобы решить, какое значение присвоить переменной. Затем я использую это значение, чтобы принять решение о среде, в которой работает машина.

Я пытаюсь перевести это на Puppet, но я не знаю, как поступить. Я знаю, что могу получить IP-адрес, используя факты, но я должен сделать это в манифесте или шаблоне? Кроме того, где я должен выполнить логические операции. Пожалуйста, имейте в виду, что я буду делать манипуляции со строками.

Подводя итог, это те шаги, которые мне нужны.

  1. Получить IP-адрес от машины.

  2. Выполните логические операции.

  3. Передайте переменную с результатом в манифест Puppet.

Основной вопрос заключается в следующем: как мне получить факт в виде переменной и куда мне поместить код для работы с этой переменной?

Заранее спасибо.

1 ответ

Решение

Вы не можете точно "извлечь" IP, используя факты, но компилятор каталога может и действительно принимает его как факт. Первый предполагает, что компилятор каталога играет активную роль в этом процессе, а это не так.

У вас есть две общие альтернативы:

  • Вычислить производное значение на узле
  • Вычислить производное значение на мастере

Вы можете вычислить значение на узле, написав собственный факт. Его работу можно упростить, полагаясь на Facter для предоставления ему IP. Результат будет представлен компилятору каталога как отдельный, отдельный факт, и с этой стороны ничего особенного не требуется, чтобы использовать его где-либо.

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

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

class site::derived_data {
    $ip_pieces = split($ipaddress, '[.]')

    # This is the derived value we are computing:
    $department = $ip_pieces[2] ? {
        0 => 'network operations',

        # ...

        default => 'other'
    }
}

Затем вы можете использовать его в другом месте, например, так:

class mymodule::myclass(
    # parameters ...
    ) {
  include site::derived_data

  notify { $site::derived_data::department : }
}
Другие вопросы по тегам