#linux #puppet
#linux #puppet
Вопрос:
Я хочу развернуть сертификаты в хранилище ключей по умолчанию, используя puppet
У меня есть два файла root.crt и intermediateca.crt, управляемых puppet. В будущем у меня будет много псевдонимов и файлов сертификатов
Псевдонимом может быть rootca, intermediateca.Этот псевдоним и путь к файлу должны быть переданы команде exec.
alias=rootca, intermediateca
filecert= "/var/lib/certs/rootca", "/var/lib/certs/intermediateca.crt"
Теперь я запускаю команду exec, которая принимает псевдоним и crt-файл в качестве аргумента в exec command resource.
'/var/lib/certs':
ensure => directory;
'/var/lib/certs/root.crt':
source => "puppet:///modules/${module_name}/sonarqube/${::env}/var/lib/certs/root.crt",
mode => '0644',
notify => Exec['markitrootca'];
'/var/lib/certs/intermediateca.crt':
source => "puppet:///modules/${module_name}/sonarqube/${::env}/var/lib/certs/intermediateca.crt",
mode => '0644',
notify => Exec['markitintermediateca'];
}
exec {
'markitrootca':
path => "/usr/bin",
command => "keytool -importcert -keystore ${keystore} -alias markitrootca -file /var/lib/certs/root.crt -storepass ${storepass} -noprompt 2>/dev/null",
provider => shell,
refreshonly => true;
'markitintermediateca':
path => "/usr/bin",
command => "keytool -importcert -keystore ${keystore} -alias markitintermediateca -file /var/lib/certs/intermediateca.crt/ -storepass ${storepass} -noprompt 2>/dev/null",
provider => shell,
refreshonly => true;
}
Вышеупомянутое решение работает нормально, но я хочу написать только один exec для нескольких псевдонимов и путей к файлам. Как я могу этого добиться?
Ответ №1:
Похоже, что вы спрашиваете здесь, как выполнить итерацию по хэшу и заставить каждый ресурс на итерации уведомлять exec
ресурс. Учитывая это, вы можете использовать лямбда-итератор для хэша. Если это не так, то, пожалуйста, проясните вопрос с терминологией и деталями. Сначала вы создаете хэш с вашими ключами:
$certs = { 'rootca' => '/var/lib/certs/rootca',
'intermediateca' => '/var/lib/certs/intermediateca.crt' }
Затем вы можете выполнить итерацию по хэшу с помощью each
метода.
$certs.each |String $cert, String $loc| {
# code here
}
Заполнение тела лямбда-выражения будет выглядеть следующим образом для вашей ситуации:
$certs.each |String $cert, String $loc| {
file { $loc:
source => "puppet:///modules/${module_name}/sonarqube/${::env}${loc}",
mode => '0644',
notify => Exec['install_cert'];
}
}
Обратите внимание, что в вашем вопросе выглядело так, как будто вы использовали атрибуты по умолчанию для каждого ресурса, но это неясно, поскольку остальная часть тела отсутствует, поэтому я преобразовал его в обычный ресурс.
Весь текст кода будет выглядеть следующим образом:
$certs = { 'rootca' => '/var/lib/certs/rootca',
'intermediateca' => '/var/lib/certs/intermediateca.crt' }
$certs.each |String $cert, String $loc| {
file { $loc:
source => "puppet:///modules/${module_name}/sonarqube/${::env}${loc}",
mode => '0644',
notify => Exec['install_cert'];
}
}
exec { 'install_cert':
path => "/usr/bin",
command => "keytool -importcert -keystore ${keystore} -alias $alias -storepass ${storepass} -noprompt -trustcacerts",
provider => linux,
subscribe => File['/var/lib/certs/'],
refreshonly => true;
}
Поскольку вы не упомянули в вопросе, что такое keystore
и storepass
, мне придется предположить, что вы определяете их в другом месте. Также вы подписываетесь на File['/var/lib/certs/']
который, я также должен предположить, находится где-то в другом месте.
Здесь можно внести другие улучшения, в том числе:
- Не указан поставщик в
exec
. - Не используя
path
вexec
, поскольку это строка, а не массив путей поиска, и вместо этого предоставляя полный путь кkeytool
. - Не подписываюсь на,
File['/var/lib/certs/']
посколькуexec
этот каталог не интересует, аnotify
предоставляют необходимую функциональность. - Не указывая путь к сертификатам, поскольку они всегда находятся в одном и том же месте, поэтому вы можете использовать один массив вместо хэша.
env
похоже на факт, а не на глобальную переменную, поэтому ее следует указывать как таковую.- Не имея глубокого
source
доступа к вашимfile
ресурсам и вместо этого просто сохраняя их внутриenv
каталога.
Полезную документацию по лямбда-итераторам можно найти здесь.
Ответ №2:
Есть гораздо лучший способ сделать это. вы можете просто определить hiera
файл yaml с массивом объектов / задач или просто записать его непосредственно в.
вместо кода, такого как
# Run Start Script*
exec { 'run script':
command => "somecmdhere",
provider => shell,
cwd => 'dir',
refreshonly => false,
logoutput => true
}
exec { 'run installation script':
command => "${target_dir}/${start_service_script}",
provider => shell,
cwd => $target_dir,
refreshonly => false,
logoutput => $cmdlogoutput
}
вы можете использовать create resource с ТИПОМ аргументов и объектами для создания
create_resources('package', )
в этом случае мы бы использовали
#goes and looks for yaml file with variable exec scripts. This can be done by also defining it in puppet.
$listofExecCommands = hiera_hash('execScripts::allscripts)
create_resources('exec', $listofExecCommands)
Затем, где бы вы ни определяли свой файл YAML, вы можете повторно использовать его без изменений кода.
вы можете использовать это для RPM-пакетов NPM, это здорово! ps убедитесь, что ваш yaml правильный*
#RPM packages to be installed
execScripts::allscripts:
'script1':
command: 'installed'
provider: 'yum'
cwd: 'somedir'
'script2':
command: 'installed'
provider: 'yum'
cwd: 'somedir'