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

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

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

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

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

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

我们是否也应该使用 Puppet 来执行步骤 2、3、4 呢?

答案1

使用 puppet 时的一个常见模式是管理包的安装、配置和服务状态。只要确保幂等性,最后一步也可以实现。此类任务的(非常)简单的框架:


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

另外,检查木偶锻造对于已经存在的可以完成您想要的操作的代码。

答案2

前三个步骤肯定属于 Puppet 的范围。安装是一种资源,如果软件包本身不执行此操作,则package可以使用 initdb 来完成,启动服务也是一种资源。execservice

但是填充数据库可能不是 Puppet 的良好用途。您可能可以使用大量自定义代码(例如,为表、函数等使用单独的资源类型)来完成此操作,但这需要大量工作,而且有点不熟悉。我建议您寻找其他方法来做到这一点。

相关内容