Я пишу модуль развертывания Puppet Ceph, и мне нужно сгенерировать ключи на узле администратора и распределить их по узлам монитора.Я написал функции на стороне сервера для извлечения ключей после их создания, но хотел бы распространять эти ключи только после того, как они существуют.
- Манифест для узла администратора генерирует ключи кластера
- Манифесты для узлов монитора и управления должны включать эти ключи в качестве файловых ресурсов.
- Манифесты не должны скомпилироваться (или генерировать ненужный том журнала), если их ключи еще не были сгенерированы
- Файловые ресурсы должны быть названы так, как они являются реквизитами для других ресурсов
nb Примеры взяты из Puppet3, поэтому не нужно отправлять Ruby: (
Что такое философски чистыйподход к сбору и распространению ключей?
Пример кода: manifest / admin_node.pp:
exec { "make_${cluster[name]}_${name}_keyring":
command => "/usr/bin/ceph-authtool --create-keyring ${ring[file]} --gen-key -n ${ring[name]} ${ring[auth]}",
require => [ File[$confdir, $bootdir], Package['ceph-common'], ],
creates => $ring[file],
}
lib / puppet / parser / functions / get_remote_file.rb:
module Puppet::Parser::Functions
newfunction(:get_remote_file, :type => :rvalue) do |args|
return "Error 3: " + args.length.to_s + " arguments were provided to get_remote_file.rb. Required is 3 to 5." if args.length < 3 or args.length > 5
remote_host = args[0]
remote_path = args[1]
local_path = args[2]
local_user = (args.length > 3) ? 'runuser -l ' + args[3] + ' ' : ''
remote_user = (args.length > 4) ? args[4] + '@' : ''
# Is the file already down?
return 0 if File.exist?(local_path)
`"#{local_user}bash -c 'scp #{remote_user}#{remote_host}:#{remote_path} #{local_path} 2> /dev/null'"`
return $?.exitstatus
end
end
manifest / monitor_node.pp:
unless file_exists($master_key) {
get_remote_file($adm_node, $monitor_keyring, $master_key)
}
exec { "check_${cluster[name]}.mon.keyring":
command => '/bin/yes',
onlyif => "/usr/bin/test -e $master_key",
}
file { "$libdir/${cluster[name]}.mon.keyring":
ensure => $f_action,
source => "puppet:///modules/ceph$libdir/${cluster[name]}.mon.keyring",
require => Exec["check_${cluster[name]}.mon.keyring"],
}
Спасибо за любые идеи о том, как справиться с этим. Я понимаю, что это ... лишает мотивации в Puppet.хороший подход?