[英]How to pass multiple values in exec command resource in puppet?
我想使用 puppet 在默認密鑰庫中部署證書
我有兩個文件 root.crt 和 middleca.crt 由 puppet 管理。 將來我會有很多別名和證書文件
別名可以是 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。 我怎樣才能做到這一點?
聽起來您在這里問的是如何迭代哈希並使迭代中的每個資源通知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
指定提供者。exec
使用path
,因為它是一個字符串而不是搜索路徑數組,而是提供keytool
的完整路徑。File['/var/lib/certs/']
因為exec
不關心該目錄並且notify
正在提供必要的功能。env
看起來像一個事實而不是一個全局變量,所以應該這樣指定。file
資源的深層source
,而只是將它們存儲在env
目錄中。可以在此處找到有關 lambda 迭代器的有用文檔。
有一個更好的方法來做到這一點。 您可以簡單地定義一個帶有對象/任務數組的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_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'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.