Я написал настраиваемую функцию марионетки, которая работает нормально и зависит от гема облачных серверов (клиентская библиотека Rackspace). Это нормально, если я предварительно установил гем на сервере перед запуском марионетки, но полностью перестает работать, если я не установил гем, поскольку функция, похоже, запускается во время развертки «компиляции», задолго до того, как мое определение пакета реализовано. Вот как выглядит мой .pp с get_hosts функцией, которая требует гем облачных серверов.
package { "rubygems":
ensure => installed,
provider => "gem";
}
package { "cloudservers":
ensure => installed,
provider => "gem",
require => Package["rubygems"];
}
class hosts::us {
$hosts = get_hosts("us")
hostentry { $hosts: }
}
define hostentry() {
$parts = split($name, ',')
$address = $parts[0]
$ip = $parts[1]
$aliases = $parts[2]
host{ $address: ip => $ip, host_aliases => $aliases }
}
Есть ли способ остановить запуск функции так рано или, по крайней мере, запустить ее, в зависимости от устанавливаемой библиотеки. В качестве альтернативы, есть ли способ добавить зависимости где-нибудь в папке функций, которые будут доступны для функции?
Все, что вы можете сделать, это завернуть require
в rescue LoadError
блок, который возвращает пустой список или любое другое простое возвращаемое значение, не вызывающее ошибок. Это должно быть сделано внутри вашей функции, так как файл, в котором находится функция, будет загружен только один раз, но код внутри вашей функции будет запускаться каждый раз при вызове функции.