使用Puppet来安装initdb并启动Postgres数据库

我们正在尝试编写一个Puppet来configuration虚拟机。 其中一个任务是安装和填充Postgres数据库

我们可以把这个任务分解成几个更小的任务:

  1. 安装
  2. 在initdb
  3. 开始
  4. 用数据填充数据库(来自生产数据库的pg_dump)

看来Puppet将负责第1步:安装。

我们是否应该使用Puppet来执行第2,3,4步?

使用puppet时常见的模式是pipe理包的安装,configuration和服务状态。 只要你保证幂等性,你最后一步也可以实现。 这种任务的(非常)简单的骨架:

class foo ( $some_param_in_hiera, ){ package { 'foo_pkg': ensure => installed, } service { 'foo_svc': ensure => running, enable => true, hasstatus => true, require => Package['foo_pkg']; } file { '/etc/foo/some.conf': mode => '0644', owner => root, group => root, source => 'puppet:///modules/foo/some.conf', #content => template('foo/some.conf.erb'), require => Package['foo_pkg'], notify => Service['foo_svc']; } exec { 'some_task': command => 'echo 'foo bar baz'', refreshonly => true, creates => '/some/file/to/ensure/idempotency' } } 

此外,检查木偶伪造已经存在的代码,做你想要的。

前三步肯定在木偶领域。 安装是一个package资源,如果软件包本身不执行,initdb可以用exec来完成,而启动服务是一个service资源。

但填充数据库可能不是一个很好的使用Puppet。 你可以用大量的自定义代码(例如,一个表格,一个函数等独立的资源types)来完成它,但是这将是一个很大的工作,而且有些不明朗的领域。 我build议你寻找一个不同的方式来做到这一点。