我想使用人偶在默认密钥库中部署证书
我有两个由puppet管理的文件root.crt和middleca.crt。将来会有很多别名和证书文件
别名可以是rootca,intermediateca。此别名和文件路径应传递给exec命令。
alias=rootca, intermediateca
filecert= "/var/lib/certs/rootca", "/var/lib/certs/intermediateca.crt"
现在我正在运行一个exec命令,该命令以别名和crt文件作为exec命令资源中的参数。
'/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。我该如何实现?
答案 0 :(得分:2)
听起来您在这里要问的是如何遍历哈希,并使迭代中的每个资源都通知exec
资源。鉴于此,您可以在哈希上使用lambda迭代器。如果不正确,请用术语和详细信息澄清问题。首先,您使用密钥构建哈希:
$certs = { 'rootca' => '/var/lib/certs/rootca',
'intermediateca' => '/var/lib/certs/intermediateca.crt' }
然后,您可以使用each
方法遍历哈希。
$certs.each |String $cert, String $loc| {
# code here
}
根据您的情况,填充lambda的主体如下所示:
$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
目录中。有关here的lambda迭代器的有用文档。
答案 1 :(得分:0)
有一个更好的方法来做到这一点。您可以简单地定义一个包含对象/任务数组的 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
}
您可以使用带有参数 TYPE 和 Objects 的 create 资源来创建
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 文件,都可以在不更改代码的情况下重复使用它。 你可以将它用于 RPMS NPM 包,它很棒! ps 确保你的 yaml 是正确的*
#RPM packages to be installed
execScripts::allscripts:
'script1':
command: 'installed'
provider: 'yum'
cwd: 'somedir'
'script2':
command: 'installed'
provider: 'yum'
cwd: 'somedir'