2016-05-24 2 views
1

У меня есть следующий класс, который устанавливает mysql и устанавливает пользователя, называемого пользователем, но когда команды 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     => { 
    '[email protected]%' => { 
     ensure     => 'present', 
     max_connections_per_hour => '0', 
     max_queries_per_hour  => '0', 
     max_updates_per_hour  => '0', 
     max_user_connections  => '0', 
     password_hash   => '...', 
    } 
    }, 
    grants     => { 
    '[email protected]%/*.*' => { 
     ensure  => 'present', 
     options => ['GRANT'], 
     privileges => ['ALL'], 
     table  => '*.*', 
     user  => '[email protected]%', 
    }, 
    } 
}-> 
exec { 'create-database': 
    creates => '/opt/dbinstalled', 
    command => '/usr/bin/mysql -u user -puser < /create-db.sql' 
} 

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

+0

Если вы используете модуль puppetlabs-mysql, вы должны проверить его тип: https://github.com/puppetlabs/puppetlabs-mysql/blob/master/manifests/db.pp, это может занять забота о пользователе и базе данных – ptierno

ответ

1

Вы должны ознакомиться с документацией для метапараметров require, before, subscribe, notify. Они используются для описания упорядочения ресурсов (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 в качестве других способов установления идемпотенции.

+0

Мне пришлось добавить require => [Mysql_grant ['user @%/*. *'], Mysql_user ['@ user.mdlocal']] –

+0

О, это настоящий ресурс. Я должен был проверить, каковы фактические ресурсы, генерируемые классом. Пробовали ли вы использовать идемпотент ресурса 'exec' или это не нужно? –

+0

/opt/dbinstalled создается во время этой команды, поэтому создание должно прекратить его выполнение в следующем положении. –

Смежные вопросы