A instalação de postgres via fantoche não atualiza a lista de pacotes, a instalação falha

1

Eu estou no host OSX 10.13.6 executando o VirtualBox 5.2.16 e o vagrant 2.1.2

Estou tentando configurar uma VM com bento/ubuntu-18.04 usando dois provedores:

1) shell inline, para obter fantoche e os módulos necessários no sistema

apt-get install puppet
puppet module install puppetlabs-postgresql

que me dá

/etc/puppet/code/modules
└─┬ puppetlabs-postgresql (v5.7.0)
  ├── puppetlabs-apt (v4.5.1)
  ├── puppetlabs-concat (v4.2.1)
  └── puppetlabs-stdlib (v4.25.1)

2) o provisionamento de fantoches

config.vm.provision "puppet" do |puppet|
  puppet.manifests_path = "vagrant/puppet/manifests/"
  puppet.options = ['--verbose', '--hiera_config /vagrant/vagrant/hiera.yaml']
  puppet.manifest_file  = "test.pp"
end

E, além dos arquivos, este é o meu manifesto mais minimalista que produz o problema:

class testproject {
  class { 'postgresql::globals':
    version             => '9.6',
    manage_package_repo => true,
    encoding            => 'UTF8',
  } ->
  class { 'postgresql::server':
    package_ensure          => latest,
    ip_mask_allow_all_users => '0.0.0.0/0',
    listen_addresses        => '*',
  } ->
  postgresql::server::config_entry { 'max_parallel_workers_per_gather':
    value => '2',
  }
  class { 'postgresql::server::contrib':
    package_ensure => latest,
  }
  postgresql::server::db { 'testdb':
    user     => 'testdb',
    password => postgresql_password('testdb', 'testdb'),
    encoding => 'UTF8',
  }

  apt::source { 'elasticsearch':
    location    => 'https://artifacts.elastic.co/packages/5.x/apt',
    release     => 'stable',
    repos       => 'main',
    key         => {
      id     => '46095ACC8548582C1A2699A9D27D666CD88E42B4',
      source => '/vagrant/vagrant/puppet/keys/elasticsearch.gpg',
    },
    include => {
      src => false,
    },
  }
  package { 'elasticsearch':
    ensure  => '5.3.0',
    require => Apt::Source['elasticsearch'],
    notify  => Service['elasticsearch'],
  }
  service { 'elasticsearch':
    ensure     => running,
    enable     => true,
    hasstatus  => true,
    hasrestart => true,
    require    => Package['elasticsearch'],
  }
  file { '/etc/elasticsearch/jvm.options':
    source  => '/vagrant/vagrant/conf/etc-elasticsearch-jvm.options',
    owner   => root,
    group   => elasticsearch,
    mode    => '0660',
    require => [
      Package['elasticsearch'],
    ],
    notify  => Service['elasticsearch'],
  }
}
class { testproject: }

Ele instala o postgres e configura um usuário e instala o ElasticSearch 5.3. A questão:

  • instale somente postgres = > trabalha
  • instale apenas ES = > trabalha
  • instale os dois, como no exemplo = > postgres falha, ES funciona

Para mim, parece que o postgres não atualiza o cache do apt-get e, portanto, não "vê" o pacote e falha.

Eu executei um provisionamento completo com --debug (achtung: ~ 1.1k lines)
= > link

O primeiro erro está na linha 1008 :
Error: /Stage[main]/Testproject/Postgresql::Server::Db[testdb]/Postgresql::Server::Role[testdb]/Postgresql_psql[CREATE ROLE testdb ENCRYPTED PASSWORD ****]: Could not evaluate: Error evaluating 'unless' clause, returned pid 14088 exit 1: 'Error: Could not execute posix command: Invalid group: postgres

Invalid group: postgres

Como nenhum dos pacotes postgres necessários foram instalados, os usuários não foram criados, etc.

Mas eu posso ver isso:

  • lista de fontes é adicionada
  • A chave GPG é importada
  • mas de alguma forma a atualização não é propagada para atualizar os pacotes

Tentei encontrar problemas relacionados à atualização do pacote em falta e encontrei o link

apt::source does not force an 'apt-get update' and fails on first run

E, de fato, consegui que funcionasse:

  • executando manualmente apt-get update na VM
  • executar o provisionamento novamente

No final, esse problema está vinculado ao link

Eu tentei modificar a instalação do postgres para depender da atualização como essa, mas nada mudou:

  class { 'postgresql::server':
    package_ensure          => latest,
    ip_mask_allow_all_users => '0.0.0.0/0',
    listen_addresses        => '*',
    require => Class['apt::update']
  } ->

Eu também tentei adicionar o exemplo dos documentos, sem efeito:

class testproject {
  Class['apt::update'] -> Package <| provider == 'apt' |>
  class { 'postgresql::globals':

Eu também me pergunto se estou com falta de dependências de recursos mais explícitas aqui. A parte postgres é de uma instalação de fantoches mais antiga onde funcionava, mas ainda não descobri se fiz algo errado aqui. Verificado com link já algumas vezes.

    
por mark 06.08.2018 / 09:38

1 resposta

1

Parece que preciso de uma dependência explícita para não ter o usuário do banco de dados sendo criado antes que o pacote seja instalado; isso mudou fixo:

  class { 'postgresql::server':
    package_ensure          => latest,
    ip_mask_allow_all_users => '0.0.0.0/0',
    listen_addresses        => '*',
  } ->
  postgresql::server::db { 'testdb':
    user     => 'testdb',
    password => postgresql_password('testdb', 'testdb'),
    encoding => 'UTF8',
  }

Ou seja. adicionando -> ali mesmo.

Definitivamente não foi "necessário" nas versões anteriores, mas agora parece ser importante ter isso explicitamente.

    
por 06.08.2018 / 10:47