繁体   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