利用 puppetlabs/mysql 模块重新启动 mysql?

利用 puppetlabs/mysql 模块重新启动 mysql?

我有两个文件夹——一个是“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,但这肯定是一种黑客行为。

这里是puppetlabs 模块

答案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']
}

相关内容