Pull to refresh

Факты в puppet

Reading time 2 min
Views 11K
Зачастую мы сталкиваемся с проблемой что стандартных фактов которые поставляются вместе с puppet не всегда хватает. Решение этой проблемы может быть достигнуто путем добавления новых фактов. Вы можете добавлять свои факты, написанные на Ruby, на puppet сервер. Затем сервер, используя синхронизацию плагинов, распространит их на все клиенты.

Для того чтобы посмотреть все факты которые сейчас есть на клиенте воспользуемся командой 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 
Tags:
Hubs:
+5
Comments 3
Comments Comments 3

Articles