簡體   English   中英

如何在人偶的exec命令資源中傳遞多個值?

[英]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;
}

由於您沒有在問題中提到keystorestorepass是什么,我將不得不假設您是在其他地方定義它們。 此外,您正在訂閱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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM