Пример использования generate(‘…’) в Puppet

Вопрос или проблема

Я пытаюсь изучить, как использовать Puppet, следуя их Руководству по быстрому старту.

Я хотел бы добавить временную метку с помощью generate:

$timestamp = generate('/bin/date')

class helloworld::motd {
    file { '/etc/motd':
    owner => 'root',
    group => 'root',
    mode => '0644',
    content => "Пантера Puppet в контроле. Последний запуск: ${timestamp}\n",
    }
}

Но в результирующем файле motd нет даты/времени:

Пантера Puppet в контроле. Последний запуск:

Что я делаю не так?

Я бы вообще не использовал generate(), этого следует избегать любой ценой.

Вместо этого обратите внимание на модуль stdlib Puppet и, в частности, на следующие функции:

strftime()
time()

Пример:
Следующий вызов функции даст временную метку в формате YYYY-MM-DD HH:MM:SS:

$timestamp = strftime("%Y-%m-%d %k:%M:%S") 

Если вы настаиваете на использовании встроенной функции generate() из языка puppet, вы можете использовать ее таким образом:

$timestamp = generate('/bin/date', '+%Y%d%m %H:%M:%S')

Более сложный пример:

$myuptime = generate("/bin/sh", "-c", "/usr/bin/uptime | /usr/bin/awk '{ print \$3}' | cut -d, -f 1 ")

Обратите внимание на использование кавычек и экранированного знака $.
Я использую имя $myuptime для своей переменной, потому что $uptime также доступна как встроенная.
Проверено на версии puppet 6.4.2 на Ubuntu 16.04.

Ответ или решение

Использование функции generate() в Puppet для получения времени

Если вы изучаете Puppet и пытаетесь использовать функцию generate() для добавления временной метки в файл /etc/motd, вам следует обратить внимание на несколько важных аспектов.

Пример использования функции generate()

В вашем примере кода вы определили переменную $timestamp с помощью функции generate():

$timestamp = generate('/bin/date')

Эта команда вызывает утилиту /bin/date, которая возвращает текущее время. Однако, стоит отметить, что функция generate() работает таким образом, что она выполняет команду и возвращает результат, но это происходит на этапе компиляции, а не во время фактического исполнения на агенте.

Следовательно, чтобы корректно получить временную метку в формате, который вам нужен, вы можете использовать следующий подход:

$timestamp = generate('/bin/date', '+%Y-%m-%d %H:%M:%S')

class helloworld::motd {
    file { '/etc/motd':
        owner   => 'root',
        group   => 'root',
        mode    => '0644',
        content => "Production puppetmaster is in control. Last run: ${timestamp}\n",
    }
}

Здесь мы добавили второй аргумент к команде generate(), который задает формат вывода date.

Альтернативный подход: Стандартная библиотека Puppet

Хотя использование generate() возможно, рекомендуется использовать более безопасные и гибкие функции, доступные через стандартную библиотеку Puppet (stdlib). Например:

$timestamp = strftime("%Y-%m-%d %H:%M:%S")

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

Учитывайте следующее

  1. Использование generate(): Лучше избегать использования этой функции, если нет особых причин, так как она может вести к неожиданным результатам, особенно в случае сложных конструкций или длительных операций.

  2. Проверка результатов: Всегда проверяйте содержимое сгенерированного файла, чтобы убедиться, что временная метка отображается корректно.

  3. Версия Puppet: Убедитесь, что вы работаете с актуальной версией Puppet, так как некоторые функции могут меняться с обновлениями.

Заключение

Использование функции generate() возможно, но предпочтительным решением является применение функций из стандартной библиотеки Puppet для большей предсказуемости и удобства использования. Оптимальный подход может выглядеть следующим образом, с использованием функции strftime() для получения временной метки. Это обеспечит правильное формирование файла /etc/motd с актуальной информацией.

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

Оцените материал
Добавить комментарий

Капча загружается...