Вопрос или проблема
Я пытаюсь изучить, как использовать 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")
Эта функция возвращает текущую дату и время в указанном формате и выполняется непосредственно на агенте в момент исполнения. Использование стандартной библиотеки имеет много преимуществ, включая простоту и читаемость кода.
Учитывайте следующее
-
Использование
generate()
: Лучше избегать использования этой функции, если нет особых причин, так как она может вести к неожиданным результатам, особенно в случае сложных конструкций или длительных операций. -
Проверка результатов: Всегда проверяйте содержимое сгенерированного файла, чтобы убедиться, что временная метка отображается корректно.
-
Версия Puppet: Убедитесь, что вы работаете с актуальной версией Puppet, так как некоторые функции могут меняться с обновлениями.
Заключение
Использование функции generate()
возможно, но предпочтительным решением является применение функций из стандартной библиотеки Puppet для большей предсказуемости и удобства использования. Оптимальный подход может выглядеть следующим образом, с использованием функции strftime()
для получения временной метки. Это обеспечит правильное формирование файла /etc/motd
с актуальной информацией.
Поставляя встраиваемый код в контексте обучения, помните о полезности чтения официальной документации, что поможет вам лучше понять возможности и ограничения, которые предоставляет Puppet.