Как передать несколько значений в ресурсе команды exec в puppet? - PullRequest
0 голосов
/ 03 апреля 2019

Я хочу развернуть сертификаты в хранилище ключей по умолчанию, используя puppet

У меня есть два файла root.crt и middleca.crt, которыми управляет puppet. В будущем у меня будет много псевдонимов и файлов сертификатов

Псевдоним может быть rootca, промежуточный. Этот псевдоним и путь к файлу должны быть переданы в команду 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 для нескольких псевдонимов и путей к файлам. Как мне этого добиться?

1 Ответ

2 голосов
/ 03 апреля 2019

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

Полезную документацию по лямбда-итераторам можно найти здесь .

...