Назад | Перейти на главную страницу

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. подвержен ошибкам, если неявная зависимость (например, от postgresql-client) создает каталог перед file заявление оценивается.

Так что мне интересно, как другие люди справляются с этим?

Есть ли лучший способ убедиться, что

но

Файлы марионеток отражают конфигурацию вашей системы и поэтому выглядят немного некрасиво. Предлагаю одно из следующих решений:

  • Реструктуризация конфигурации вашей системы может немного помочь. Не монтируйте свое устройство в / 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 вариант, как описано в Документация по марионетке

  • Измените каталоги данных ваших приложений. Большинство приложений позволяют это. Для Postgres настройка data_directory() должен помочь вам, также см. Документация PostgreSQL.