puppetlabs-mysq (v3.0.0): временный пользователь

У нас есть марионеточная установка, которая в основном работает так:

  1. Создать пользователя "puppetdeploy"
  2. Предоставить доступ ко всем таблицам для пользователя "puppetdeploy"
  3. Запускает сценарии, которые создают и обновляют базы данных из файлов.sql, используя 'puppetdeploy'
  4. Отменить все права доступа пользователя 'puppetdeploy'

Файл.pp выглядит примерно так:

mysql_user { 'puppetdeploy@localhost':
   ensure => 'present',
   password_hash => '*****',           
}->
mysql_grant { 'grant_all_for_puppetdeploy':
   ensure     => 'present',
   options    => ['GRANT'],
   privileges => ['ALL'],
   table      => '*.*',
   user       => 'puppetdeploy@localhost',
}
#... execute scripts to import bunch of .sql files using mysql user 'puppetdeploy'
mysql_grant { 'revoke_all_for_puppetdeploy':
   options    => ['REVOKE'],
   privileges => ['ALL'],
   table      => '*.*',
   user       => 'puppetdeploy@localhost',
}   

В более поздних версиях модуля mysql это больше не работает, так как имя для каждого гранта должно быть в формате '[user]/[table]', и мне не разрешено иметь одно и то же имя для двух или более mysql_grants.

Есть ли какие-нибудь способы обойти это ограничение в puppetlabs-mysql 3.0.0, или есть лучшие способы иметь дело с временными пользователями mysql?

1 ответ

Решение

Проблема в том, что такие рабочие процессы плохо согласуются с парадигмой Puppet. Манифест марионетки не является сценарием. Это описание состояния, которое вы хотите, чтобы Puppet приводил в исполнение. Конечно, переходы часто требуют сериализованных шагов настройки, чтобы все было правильно, но у всего должно быть одно определенное состояние, с которым должен синхронизироваться Puppet, и он должен оставаться в этом состоянии.

Все рабочие процессы, которые требуют одного или нескольких ресурсов для принятия нескольких разных состояний во время одной и той же транзакции Puppet, создают трудности и обычно решаются с помощью какого-то взлома.

В вашем конкретном сценарии может быть лучше отказаться от mysql_grant введите в пользу сценария, который развертывает и запускает Puppet, который будет выполнять все шаги, описанные в вашей выдержке из манифеста. Это не совсем Puppet-y, но гораздо чище, потому что вы не пытаетесь заставить Puppet перемещать один и тот же ресурс из одного состояния в другое.

А еще лучше - разрешите Puppet использовать привилегии действительной учетной записи администратора.

В качестве компромисса вы можете добавить пользовательский факт, который позволит Puppet определить, что все GRANT находятся в порядке в начале последующей транзакции, и затем удалить пользователя.

if $grants_are_deployed {
    mysql_grant { 'revoke_all_for_puppetdeploy': ... }
else {
    mysql_user { 'puppetdeploy@localhost': }
}   
Другие вопросы по тегам