puppetlabs-mysq (v3.0.0): временный пользователь
У нас есть марионеточная установка, которая в основном работает так:
- Создать пользователя "puppetdeploy"
- Предоставить доступ ко всем таблицам для пользователя "puppetdeploy"
- Запускает сценарии, которые создают и обновляют базы данных из файлов.sql, используя 'puppetdeploy'
- Отменить все права доступа пользователя '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': }
}