-
Notifications
You must be signed in to change notification settings - Fork 794
/
db.pp
138 lines (130 loc) · 5.42 KB
/
db.pp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# @summary
# Create and configure a MySQL database.
#
# @example Create a database
# mysql::db { 'mydb':
# user => 'myuser',
# password => 'mypass',
# host => 'localhost',
# grant => ['SELECT', 'UPDATE'],
# }
#
# @param name
# The name of the database to create. Database names must:
# * not be longer than 64 characters.
# * not contain '/' '\' or '.' characters.
# * not contain characters that are not permitted in file names.
# * not end with space characters.
# @param user
# The user for the database you're creating.
# @param password
# The password for $user for the database you're creating.
# @param tls_options
# The tls_options for $user for the database you're creating.
# @param dbname
# The name of the database to create.
# @param charset
# The character set for the database. Must have the same value as collate to avoid corrective changes. See https://dev.mysql.com/doc/refman/8.0/en/charset-mysql.html for charset and collation pairs.
# @param collate
# The collation for the database. Must have the same value as charset to avoid corrective changes. See https://dev.mysql.com/doc/refman/8.0/en/charset-mysql.html for charset and collation pairs.
# @param host
# The host to use as part of user@host for grants.
# @param grant
# The privileges to be granted for user@host on the database.
# @param grant_options
# The grant_options for the grant for user@host on the database.
# @param sql
# The path to the sqlfile you want to execute. This can be an array containing one or more file paths.
# @param enforce_sql
# Specifies whether executing the sqlfiles should happen on every run. If set to false, sqlfiles only run once.
# @param ensure
# Specifies whether to create the database. Valid values are 'present', 'absent'. Defaults to 'present'.
# @param import_timeout
# Timeout, in seconds, for loading the sqlfiles. Defaults to 300.
# @param import_cat_cmd
# Command to read the sqlfile for importing the database. Useful for compressed sqlfiles. For example, you can use 'zcat' for .gz files.
# @param mysql_exec_path
# Specify the path in which mysql has been installed if done in the non-standard bin/sbin path.
#
define mysql::db (
String[1] $user,
Variant[String, Sensitive[String]] $password,
Optional[Array[String[1]]] $tls_options = undef,
String $dbname = $name,
String[1] $charset = 'utf8mb3',
String[1] $collate = 'utf8mb3_general_ci',
String[1] $host = 'localhost',
Variant[String[1], Array[String[1]]] $grant = 'ALL',
Optional[Variant[String[1], Array[String[1]]]] $grant_options = undef,
Optional[Array] $sql = undef,
Boolean $enforce_sql = false,
Enum['absent', 'present'] $ensure = 'present',
Integer $import_timeout = 300,
Enum['cat', 'zcat', 'bzcat'] $import_cat_cmd = 'cat',
Optional[String] $mysql_exec_path = undef,
) {
include 'mysql::client'
# Ensure that the database name is valid.
if $dbname !~ /^[^\/?%*:|\""<>.\s;]{1,64}$/ {
$message = "The database name '${dbname}' is invalid. Values must:
* not be longer than 64 characters.
* not contain '/' '\\' or '.' characters.
* not contain characters that are not permitted in file names.
* not end with space characters."
fail($message)
}
# Ensure that the sql files passed are valid file paths.
if $sql {
$sql.each | $sqlfile | {
if $sqlfile !~ /^\/(?:.[.A-Za-z0-9_-]+\/?+)+(?:\.[.A-Za-z0-9]+)+$/ {
$message = "The file '${sqlfile}' is invalid. A valid file path is expected."
fail($message)
}
}
}
if ($mysql_exec_path) {
$_mysql_exec_path = $mysql_exec_path
} else {
$_mysql_exec_path = $mysql::params::exec_path
}
$db_resource = {
ensure => $ensure,
charset => $charset,
collate => $collate,
provider => 'mysql',
require => [Class['mysql::client']],
}
ensure_resource('mysql_database', $dbname, $db_resource)
$user_resource = {
ensure => $ensure,
password_hash => Deferred('mysql::password', [$password]),
tls_options => $tls_options,
}
ensure_resource('mysql_user', "${user}@${host}", $user_resource)
if $ensure == 'present' {
$table = "${dbname}.*"
mysql_grant { "${user}@${host}/${table}":
privileges => $grant,
provider => 'mysql',
user => "${user}@${host}",
table => $table,
options => $grant_options,
require => [
Mysql_database[$dbname],
Mysql_user["${user}@${host}"],
],
}
if $sql {
exec { "${dbname}-import":
command => "${import_cat_cmd} ${shell_join($sql)} | mysql ${dbname}",
logoutput => true,
environment => "HOME=${facts['root_home']}",
refreshonly => ! $enforce_sql,
path => "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:${_mysql_exec_path}",
require => Mysql_grant["${user}@${host}/${table}"],
subscribe => Mysql_database[$dbname],
timeout => $import_timeout,
}
}
}
}