我有两个文件夹——一个是“public_modules”,另一个是“private_modules”。当我启动新的 Vagrant 机器时,“public_modules”文件夹中会填充我的 Puppetfile 中描述的模块(为简洁起见,这些都是 puppetforge 上的模块)。“private_modules”保存我需要对公共模块进行的任何修改和设置。通过使用 librarian-puppet,我不需要签入这些公共模块,也不需要依赖 git 子模块。请考虑以下清单文件:
class drupaldb {
class { '::mysql::server':
root_password => 'platform',
override_options => { 'mysqld' => { 'max_connections' => '1024', 'bind-address' => '0.0.0.0' } }
}
mysql::db { 'drupaldb':
user => 'root',
password => 'platform',
host => '%',
grant => ['SELECT', 'UPDATE', 'DELETE'],
}
service { 'mysql':
ensure => running,
enable => true,
subscribe => File['/etc/mysql/my.cnf']
}
}
配置 Vagrant 将失败,因为 mysql 服务已经在公共模块中定义:
class mysql::server::service {
if $mysql::server::real_service_enabled {
$service_ensure = 'running'
} else {
$service_ensure = 'stopped'
}
if $mysql::server::real_service_manage {
file { $mysql::params::log_error:
owner => 'mysql',
group => 'mysql',
}
service { 'mysqld':
ensure => $service_ensure,
name => $mysql::server::service_name,
enable => $mysql::server::real_service_enabled,
provider => $mysql::server::service_provider,
}
}
}
那么,我一直无法解决的是如何指示 mysql 在模块结束时重新启动?我已求助于通过 Vagrantfile 末尾的内联 shell 命令重新启动 mysql,但这肯定是一种黑客行为。
答案1
我遇到了同样的问题,并通过在::mysql::server 初始化中添加“重新启动”参数解决了它。
class { '::mysql::server':
override_options => $override_options,
restart => true,
}
这会告诉 mysql 模块一旦发生任何变化就重新启动 mysql。
答案2
我不明白的是,你为什么要重新启动它? puppetlabs-mysql 模块将管理所有配置更改后所需的所有重启。
无论如何,除非 my.cnf 文件发生变化,否则您的服务声明不会重新启动 MySQL。由于所有更改都是通过 puppetlabs-mysql 模块完成的,它将重新启动服务本身,因此我看不出您的声明有什么意义。
但是,不去探究为什么要这样做的原因,我建议您在模块末尾添加以下资源:
notify { 'restart_mysql':
notify => Service['mysqld'],
require => [ Class['::mysql::server'], ::Mysql::Db['drupaldb'] ],
}
或者你可以使用 exec 手动执行此操作:
exec { 'restart_mysql':
cmd => 'service mysqld restart',
require => [ Class['::mysql::server'], ::Mysql::Db['drupaldb'] ],
}
答案3
由于模块将service
资源包装在一个方便的类中,因此解决这个问题的规范方法是向该类发送事件。
File['/etc/mysql/my.cnf'] ~> Class['mysql::server::service']
这有点尴尬,因为file
资源也不在本地范围内。通常它看起来像这样
file { '/etc/mysql/my.cnf':
...
notify => Class['mysql::server::service']
}