Как связать классы с помощью команд

У меня есть следующий класс, который устанавливает mysql и настраивает пользователя с именем user, но когда запускаются команды create-database, пользователь еще не был создан. Как связать команды так, чтобы пользователь был создан до того, как create-database попытается его использовать?

class { '::mysql::server':
  package_name            => 'mariadb-server.x86_64',
  root_password           => 'root',
  remove_default_accounts => true,
  override_options        => $override_options,
  restart                 => true,
  users                   => {
    'user@%' => {
      ensure                   => 'present',
      max_connections_per_hour => '0',
      max_queries_per_hour     => '0',
      max_updates_per_hour     => '0',
      max_user_connections     => '0',
      password_hash            => '...',
    }
  },
  grants                  => {
    'user@%/*.*' => {
      ensure     => 'present',
      options    => ['GRANT'],
      privileges => ['ALL'],
      table      => '*.*',
      user       => 'user@%',
    },
  }
}->
exec { 'create-database':
  creates => '/opt/dbinstalled',
  command => '/usr/bin/mysql -u user -puser < /create-db.sql'
}

Я использую пакет puppetlabs-mysql для установки mysql.

1 ответ

Решение

Вы должны взглянуть на документацию для require, before, subscribe, notify metaparameters. Они используются для описания порядка ресурсов (before, notify) или упорядочение ресурсов и сбой, если зависимость не удается (require, subscribe). Обратите внимание subscribe, notify метапараметры доступны только для некоторых типов ресурсов (exec, service, так далее.).

В этом случае вы должны сделать следующее, чтобы связать класс:

exec { 'create-database':
  creates => '/opt/dbinstalled',
  command => '/usr/bin/mysql -u user -puser < /create-db.sql',
  require => Class[::mysql::server],
}

Но вам действительно нужна зависимость только от пользовательского ресурса:

exec { 'create-database':
  creates => '/opt/dbinstalled',
  command => '/usr/bin/mysql -u user -puser < /create-db.sql',
  require => User[username or array of users],
}

Кроме того, вы, вероятно, хотите создать базу данных только один раз, поэтому мы можем subscribe/refreshonly для идемпотентности:

exec { 'create-database':
  creates     => '/opt/dbinstalled',
  command     => '/usr/bin/mysql -u user -puser < /create-db.sql',
  subscribe   => User[username or array of users],
  refreshonly => true,
}

Обратите внимание, что если вы измените user ресурс, который create-database подписан на это будет перезапустить exec ресурс, так что посмотрите в unless, onlyif параметры для exec как и другие методы установления идемпотентности.

Другие вопросы по тегам