2016-05-24 14 views
1

Ich habe die folgende Klasse, die mysql installiert und einen Benutzer namens Benutzer einrichtet, aber wenn die create-database Befehle ausgeführt werden, wurde der Benutzer noch nicht erstellt. Wie verknüpfe ich die Befehle, damit der Benutzer erstellt wird, bevor create-database versucht, sie zu verwenden?So ketten Klassen mit Befehlen

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' 
} 

Ich verwende das puppetlabs-mysql-Paket, um mysql zu installieren.

+0

Wenn Sie das puppetlabs-mysql-Modul verwenden, sollten Sie den definierten Typ prüfen, mit dem es geliefert wird: https://github.com/puppetlabs/puppetlabs-mysql/blob/master/manifests/db.pp, könnte es dauern Sorge für den Benutzer und die Datenbank – ptierno

Antwort

1

Sie sollten sich die Dokumentation zu den require, before, subscribe, notify Metaparametern ansehen. Sie werden verwendet, um die Ressourcenreihenfolge (before, notify) oder die Ressourcenreihenfolge und den Fehler zu beschreiben, wenn die Abhängigkeit fehlschlägt (require, subscribe). Beachten Sie, dass die Metaparameter subscribe, notify nur für einige Ressourcentypen verfügbar sind (exec, service usw.).

In diesem Fall würden Sie die folgende Kette eine Klasse tun:

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

Aber Sie müssen wirklich nur die Abhängigkeit von der Benutzer-Ressource:

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

auch nur für Sie wollen wahrscheinlich erstellen, sobald die Datenbank, so können wir es ein subscribe/refreshonly für idempotence geben:

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, 
} 

Beachten Sie, dass wenn Sie die user Ressource ändern, die die create-database abonniert wird dies die Ressource exec erneut ausführen wird, so in die unless, onlyif Parameter für exec als andere Methoden zum Einrichten von Idempotenz.

+0

Ich musste am Ende Require => [Mysql_grant ['Benutzer @%/*. *'], Mysql_user ['@ user.mdlocal']] –

+0

Oh das ist die eigentliche Ressource. Ich hätte überprüfen sollen, was die tatsächlichen Ressourcen sind, die von der Klasse generiert werden. Haben Sie versucht, die 'exec' Ressource idempotent zu machen oder ist das nicht notwendig? –

+0

/opt/dbinstalled wird während dieses Befehls erstellt, sodass creates es bei der nächsten Bereitstellung stoppen sollte. –