我们正在尝试编写一个 Puppet 来配置虚拟机。其中一项任务是安装 Postgres 数据库并向其中填充数据。
我们可以把这个任务分解成几个较小的任务:
- 安装
- 初始化数据库
- 开始
- 用数据填充数据库(来自生产数据库的 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 来完成,启动服务也是一种资源。exec
service
但是填充数据库可能不是 Puppet 的良好用途。您可能可以使用大量自定义代码(例如,为表、函数等使用单独的资源类型)来完成此操作,但这需要大量工作,而且有点不熟悉。我建议您寻找其他方法来做到这一点。