Какой хороший способ проверить текущую дату / время в марионетке, чтобы реализовать временное изменение?
например у нас только что возникла проблема с безопасностью NTP, и Debian потребовалось время, чтобы выпустить обновление. Казалось, что проще всего на время отключить ntp.
service { 'ntp':
# remember to re-enable this after ntp is secured. CVE-XXXXXXXXXX
ensure => "stopped",
...
}
Так что для этого нужно не забыть вернуться и изменить это обратно. Я бы хотел, чтобы ценность ensure
Атрибут зависит от селектора, который проверял дату во время выполнения.
Может ли кто-нибудь предложить хороший способ сделать это?
Я могу представить, как сделать для этого функцию доступной через парсер марионеток, и было бы неплохо узнать, написал ли кто-то это уже, но бонусные баллы, если у вас есть способ сделать это без дополнительного модуля.
service { 'ntp':
ensure => date_is_after("23 Dec 2014"): {
true => "running",
false => "stopped"
}
...
}
Мне также приходит в голову, что тест, основанный на текущей версии пакета ntp, был бы довольно элегантным, но я также не уверен, как вы это сделаете в puppet.
Чтобы иметь возможность получить текущую версию пакета NTP, вам нужно будет написать собственный факт, который будет передан на каждый управляемый хост через pluginsync
и определяет значение, запрашивая локальный менеджер пакетов. Видеть https://docs.puppetlabs.com/facter/2.3/custom_facts.html для написания нестандартных фактов.
Затем вы можете использовать versioncmp()
в вашем манифесте, чтобы условно включить или отключить демон NTP, используя значение этого факта и сравнивая его с заведомо хорошей версией NTP, содержащей ваше исправление.
Чтобы использовать дату на мастере, вы можете написать простую оболочку для date
и вызвать его из манифеста, используя сгенерировать функцию.
$ echo -e '#!/bin/bash\n/bin/date -I\n' >/tmp/dater
$ chmod 755 /tmp/dater
$ bundle exec puppet apply -e 'notice(generate("/tmp/dater"))'
Notice: Scope(Class[main]): 2014-12-23
Вы можете получить результат в переменной и сойти с ума.
$now = generate("/tmp/dater")
Поскольку Puppet не будет сравнивать строки, используя <
и >
лайк bash
или awk
сделать, вы, вероятно, захотите использовать date +%s
вместо этого, чтобы вы могли численно сравнить отметку времени с любой заданной вами целевой датой.
Кстати, я бы лично воздержался от реализации такого рода вещей. Это связано с большим риском довольно сильно упасть на ногу. Вместо этого рассмотрите возможность определения глобальной клавиши Hiera, которую вы можете перевернуть вручную после того, как ваш календарь напомнит вам об этом. Не делайте дружеских сюрпризов в Puppet.
Вы можете написать такой внешний факт:
#!/bin/bash
echo "date=$(date '+%Y-%m-%d')"
Чтобы распространить его, вы можете поместить его в новый модуль (например, modules/date/facts.d/date
).
И тогда вы можете сделать
if $::date > "2016-05-15" {
...
}