通过 puppet 安装 postgres 不会刷新包列表,安装失败

通过 puppet 安装 postgres 不会刷新包列表,安装失败

我在运行 VirtualBox 5.2.16 和 vagrant 2.1.2 的 OSX 10.13.6 主机上

bento/ubuntu-18.04我正在尝试使用两个配置程序来设置虚拟机:

1)内联 shell,获取 puppet 和系统上所需的模块

apt-get install puppet
puppet module install puppetlabs-postgresql

这让我

/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)傀儡配置

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

除了文件之外,这是我产生问题的最简单的清单:

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: }

它安装了 postgres 并设置了一个用户,然后安装了 ElasticSearch 5.3。问题:

  • 仅安装 postgres => 有效
  • 仅安装 ES => 有效
  • 像示例中那样安装两者 => postgres 失败,ES 有效

对我来说,postgres 似乎没有刷新 apt-get 缓存,因此没有“看到”该包并失败。

我已经运行了完整的配置--debug(achtung:~1.1k 行)
=>https://gist.github.com/mfn/8656324a8dcd736d45035ea8cd0ee74a

第一个错误出现在 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

无效组:postgres

因为没有安装所需的 postgres 包,所以没有创建用户,等等。

但我可以看到:

  • 已添加源列表
  • 已导入 GPG 密钥
  • 但不知何故刷新没有传播到更新包

我尝试查找与缺少软件包更新相关的问题,并发现https://tickets.puppetlabs.com/browse/MODULES-2190

apt::source 不会强制执行“apt-get update”,因此第一次运行时会失败

事实上,我可以通过以下方式让它工作:

  • apt-get update在虚拟机中手动运行
  • 再次运行配置

最后这个问题链接到https://github.com/puppetlabs/puppetlabs-apt#adding-new-sources-or-ppas

我尝试修改 postgres 安装以依赖于这样的更新,但没有任何改变:

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

我也尝试添加文档中的示例,但没有效果:

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

我还想知道我是否在这里遗漏了更明确的资源依赖关系。postgres 部分来自一个较旧的 puppet 安装,它可以正常工作,但我还没有弄清楚我是否在这里做错了什么。检查了https://forge.puppet.com/puppetlabs/postgresql已经几次了。

答案1

似乎我需要一个明确的依赖关系,以便在安装包之前不创建 DB 用户;这个改变修复了它:

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

即在那里添加->

在以前的版本中肯定不是“需要”的,但现在明确说明这一点似乎很重要。

相关内容