我们目前使用 puppet 3.8.7 来配置大量 AWS EC2 实例。
由于这些机器的根卷较小且速度较慢,我们将某些目录从 /var 符号链接到 /mnt。
这导致出现如下片段的谜题:
group { 'postgres':
ensure => present,
system => true,
}
user { 'postgres':
ensure => present,
comment => 'PostgreSQL administrator',
gid => 'postgres',
home => '/var/lib/postgresql',
require => Group['postgres'],
}
file { '/mnt/postgresql':
ensure => directory,
owner => 'postgres',
group => 'postgres',
mode => '0755',
require => User['postgres'],
}
file { '/var/lib/postgresql':
ensure => link,
target => '/mnt/postgresql',
require => File['/mnt/postgresql'],
before => Class['dbserver'],
}
这是
丑陋的
过于冗长
和
file
如果隐式依赖关系(例如 postgresql-client)在评估语句之前创建目录,则容易出错。
所以我想知道其他人是如何解决这个问题的?
有没有更好的方法可以确保
- 这样的符号链接总是在包含目录的包安装之前创建
但
- 他们仅有的如果包中包含目录,则创建将是安装?
答案1
puppet 文件反映了您的系统配置,因此有点难看。我建议使用以下解决方案之一:
重构系统配置可能会有所帮助。不要将设备安装到 /mnt/postgres,而要安装到 /var/lib/postgresql,或者使用分区
/var
。如果您唯一的问题是在创建符号链接之前安装了 postgres,那么这很容易:在安装 postgres 之前强制创建符号链接。
package { 'postgresql': ensure => installed, require => File['/var/lib/postgresql'], }
如果您想修复问题仍然存在的系统,我建议实施一个修复
exec
语句,类似于:exec { '/usr/local/bin/fix_postgres_installation.sh': user => 'root, onlyif => 'test -d /var/lib/postgresql', before => File['/var/lib/postgresql'], }
该脚本可能会关闭 postgres、将数据同步到
/mnt/postgres
、删除/var/lib/postgres
。如果您只是想强制删除文件资源的目录,可以使用选项
force
,如Puppet 文档更改应用程序的数据目录。大多数应用程序都允许这样做。对于 Postgres,设置
data_directory()
应该会有所帮助,另请参阅PostgreSQL 文档。