puppet:用于尚未安装的软件包中的目录的符号链接

我们目前使用puppet 3.8.7来configuration大量的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'], } 

这是

  1. 丑陋
  2. 过于冗长

  3. 如果隐式依赖(如postgresql-client)在评估file语句之前创build目录,则容易出错。

所以我想知道,其他人怎么解决呢?

有没有更好的方法来确保

  • 这种符号链接总是在包含目录的软件包被安装之前被创build

  • 它们只有在包含目录的包将被安装时才会被创build?

傀儡文件反映了你的系统configuration,因此有点丑陋。 我build议以下解决scheme之一:

  • 重组您的系统configuration可能会有所帮助。 不要将设备挂载到/ mnt / postgres,而是挂载到/ var / lib / postgresql,或者使用/var分区。

  • 如果你唯一的问题是在创build符号链接之前安装postgres,这很简单:在postgres安装之前强制创build符号链接。

     package { 'postgresql': ensure => installed, require => File['/var/lib/postgresql'], } 

    如果你想修复你的问题已经存在的系统,我build议实施一个修复exec语句,类似这样:

     exec { '/usr/local/bin/fix_postgres_installation.sh': user => 'root, onlyif => 'test -d /var/lib/postgresql', before => File['/var/lib/postgresql'], } 

    脚本可能会closurespostgres,将数据同步到/mnt/postgres ,删除/var/lib/postgres

  • 如果您只是想强制删除文件资源,可以使用force选项,如Puppet文档中所述

  • 更改您的应用程序的数据目录。 大多数应用程序都允 对于Postgres,settign data_directory()应该对你有所帮助,另外请参阅PostgreSQL文档 。