Зачастую мы сталкиваемся с проблемой что стандартных фактов которые поставляются вместе с puppet не всегда хватает. Решение этой проблемы может быть достигнуто путем добавления новых фактов. Вы можете добавлять свои факты, написанные на Ruby, на puppet сервер. Затем сервер, используя синхронизацию плагинов, распространит их на все клиенты.
Для того чтобы посмотреть все факты которые сейчас есть на клиенте воспользуемся командой facter -p
Для чего нужны факты можно посмотреть в начале статьи пользователя Badoo.
Допустим, нам нужно получить вывод команды uname -i для определения разрядности системы. Для этого нам нужно создать факт. Назовем наш факт hardware_platform, и создадим hardware_platform.rb, на Puppet сервере:
{modulepath}
└── {module}
└── lib
└── facter
Мы можем использовать значения фактов при написании своих используя конструкцию Facter.value(“somefact”) или Facter.somefact. При отсутствии факта первый вернет 0, а второй exception.
Теперь после следующего запуска puppet агента на клиенте, факт станет доступным.
На puppet сервере и клиенте в разделе [main] должна присутствовать опция
Факты имеют несколько параметров, которые можно использовать для тонкой настройки фактов
Если ваш факт ненадежен и не всегда может корректно завершить работу, вы можете использовать timeout. Если время выполнения setcode блока будет превышает timeout, Facter прервет процесс и присвоит факту заданное при ошибке значение.
Если факты некоторое время не изменяются или для их нахождения требуется много времени, их можно закэшировать. Для этого нам нужно добавить опцию ':ttl' при объявлении факта
0 — никогда не кэшировать. Поведение по умолчанию.
-1 — Кэш навсегда. Полезно для разовых операций. Например: название дистрибутива.
У фактов есть параметр — weight (вес). Факты с большим весом выполняются раньше
Мы можем ограничивать выполнение фактов, на основание других фактов с помощью параметра — confine.
Например, найти факт только если ядро системы — Linux
Для того чтобы посмотреть все факты которые сейчас есть на клиенте воспользуемся командой facter -p
Для чего нужны факты можно посмотреть в начале статьи пользователя Badoo.
Пример
Допустим, нам нужно получить вывод команды uname -i для определения разрядности системы. Для этого нам нужно создать факт. Назовем наш факт hardware_platform, и создадим hardware_platform.rb, на Puppet сервере:
{modulepath}
└── {module}
└── lib
└── facter
# hardware_platform.rb
Facter.add("hardware_platform") do
setcode do
Facter::Util::Resolution.exec('/bin/uname -i')
end
end
Факты в фактах
Мы можем использовать значения фактов при написании своих используя конструкцию Facter.value(“somefact”) или Facter.somefact. При отсутствии факта первый вернет 0, а второй exception.
Facter.add("osfamily") do
setcode do
distid = Facter.value('lsbdistid')
case distid
when /RedHatEnterprise|CentOS|Fedora/
"redhat"
when "ubuntu"
"debian"
else
distid
end
end
end
Теперь после следующего запуска puppet агента на клиенте, факт станет доступным.
Замечание
На puppet сервере и клиенте в разделе [main] должна присутствовать опция
pluginsync = true
Настройка фактов.
Факты имеют несколько параметров, которые можно использовать для тонкой настройки фактов
Timeout
Если ваш факт ненадежен и не всегда может корректно завершить работу, вы можете использовать timeout. Если время выполнения setcode блока будет превышает timeout, Facter прервет процесс и присвоит факту заданное при ошибке значение.
# Случайный timeout
Facter.add(:sleep) do
timeout = 10
setcode do
if Random.rand(6) == 0
sleep 999999
else
"awake"
end
end
end
Кэширование
Если факты некоторое время не изменяются или для их нахождения требуется много времени, их можно закэшировать. Для этого нам нужно добавить опцию ':ttl' при объявлении факта
Facter.add("mylongoperation", :ttl => 600) do
setcode do
... операция ...
end
end
0 — никогда не кэшировать. Поведение по умолчанию.
-1 — Кэш навсегда. Полезно для разовых операций. Например: название дистрибутива.
Важность фактов
У фактов есть параметр — weight (вес). Факты с большим весом выполняются раньше
# Проверяем
Facter.add(:role) do
has_weight 100
setcode do
if File.exist? "/etc/postgres_server"
"postgres_server"
end
end
end
# Проверяем есть ли бинарник
Facter.add(:role) do
has_weight 50
setcode do
if File.exist? "/usr/sbin/pg_create"
"postgres_server"
end
end
end
# Если сервер не похож на сервер, значит это десктоп
Facter.add(:role) do
setcode do
"desktop"
end
end
Ограничение фактов
Мы можем ограничивать выполнение фактов, на основание других фактов с помощью параметра — confine.
Например, найти факт только если ядро системы — Linux
Facter.add(:powerstates) do
confine :kernel => "Linux"
setcode do
Facter::Util::Resolution.exec('cat /sys/power/states')
end
end