Похоже, что вы спрашиваете здесь, как перебирать хеш и каждый ресурс в итерации уведомляет ресурс 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
.
Полезную документацию по лямбда-итераторам можно найти здесь .