Как связать классы с помощью команд
У меня есть следующий класс, который устанавливает 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
как и другие методы установления идемпотентности.