puppet: links simbólicos para diretórios em pacotes ainda a serem instalados

2

Atualmente, usamos o fantoche 3.8.7 para provisionar um grande número de instâncias do AWS EC2.

Como essas máquinas têm volumes de raiz pequenos e lentos, simbolizamos certos diretórios de, por exemplo, / var para / mnt.

Isso leva a manifestar enigmas com segmentos como este:

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'],
}

Isso é

  1. feio
  2. excessivamente detalhado

    e

  3. propenso a erros se uma dependência implícita (por exemplo, no postgresql-client) criar o diretório antes que a instrução file seja avaliada.

Então, eu estou pensando, como as outras pessoas lidam com isso?

Existe uma maneira melhor de garantir que

  • tais symlinks sempre são criados antes que o pacote que contém o diretório seja instalado

mas

  • eles somente são criados se um pacote contendo o diretório for instalado?
por Phil Taprogge 05.09.2016 / 14:27

1 resposta

1

Os arquivos fantoches estão refletindo a configuração do seu sistema e, portanto, são um pouco feios. Eu sugiro uma das seguintes soluções:

  • Reestruturar a configuração do seu sistema pode ajudar um pouco. Não monte seu dispositivo em / mnt / postgres, mas em / var / lib / postgresql, ou use uma partição /var .

  • Se o seu único problema é o postgres ser instalado antes da sua criação do symlink, isto é fácil: Impor a criação do symlink antes da instalação do postgres.

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

    Se você deseja corrigir sistemas em que seu problema já persiste, recomendo implementar uma declaração exec de correção, semelhante a esta:

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

    O script pode encerrar o postgres, sincronizar os dados com /mnt/postgres , excluir /var/lib/postgres .

  • Se você quiser simplesmente forçar a exclusão do diretor para o recurso de arquivo, poderá usar a opção force , conforme descrito no Puppet documentation

  • Altere os diretórios de dados de seus aplicativos. A maioria das aplicações permite isso. Para o Postgres, o settign data_directory() deve ajudá-lo, veja também a Documentação do PostgreSQL .

por 05.09.2016 / 17:49