Как передать несколько значений в exec command resource в puppet?

#linux #puppet

#linux #puppet

Вопрос:

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

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

Псевдонимом может быть rootca, intermediateca.Этот псевдоним и путь к файлу должны быть переданы команде exec.

 alias=rootca, intermediateca
filecert= "/var/lib/certs/rootca", "/var/lib/certs/intermediateca.crt"
  

Теперь я запускаю команду exec, которая принимает псевдоним и crt-файл в качестве аргумента в exec command resource.

     '/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:

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

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

Ответ №2:

Есть гораздо лучший способ сделать это. вы можете просто определить 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
  }

  

вы можете использовать create resource с ТИПОМ аргументов и объектами для создания

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, вы можете повторно использовать его без изменений кода.
вы можете использовать это для RPM-пакетов NPM, это здорово! ps убедитесь, что ваш yaml правильный*

 #RPM packages to be installed
execScripts::allscripts:
   'script1':
     command: 'installed'
     provider: 'yum'
     cwd: 'somedir'
   'script2':
     command: 'installed'
     provider: 'yum'
     cwd: 'somedir'