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

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

我们目前使用 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'],
}

这是

  1. 丑陋的

  2. 过于冗长

  3. 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 文档

相关内容