由于缺少 OS 包,Pupppet 配置期间的依赖循环

Dependency loop during Pupppet provisioning due missing OS package

我正在尝试使用 VagrantPuppet 配置我的开发服务器。下面是我此时的一些 Puppet Manifest。我遇到的问题是我最终陷入了一个当然正确的依赖循环。唯一的问题是我没有找到解决方法,因此我需要一些帮助。

我正在使用名为 puppetlabs/ubuntu-14.04-64-puppet 的 Puppetlabs 提供的最新版本的盒子。在向包管理器添加 PPA 时,我收到 apt-add-repository 不可用的错误。因此你需要安装 software-properties-common 包。

唯一的问题是在安装这个包之前,你需要运行 apt-get update。第二个问题是清单不接受它,它会尝试在之前添加 PPA,因此,当然这是一个逻辑结论,它只需要更新包管理器一次。但是通过选择最后一个解决方案,我将陷入一个触发错误的循环:

==> default: Error: Failed to apply catalog: Found 1 dependency cycle: ==> default: (Exec[add-apt-repository-ppa:ondrej/php-7.0] => Class[Apt::Update] => Exec[apt_update] => Class[Apt::Update] => Package[git] => Class[Systempackages] => Apt::Ppa[ppa:ondrej/php-7.0] => Exec[add-apt-repository-ppa:ondrej/php-7.0])

class systempackages {
  package { [ 'git', 'curl', 'acl', 'unattended-upgrades', 'vim', 'software-properties-common']:
    ensure => "installed",
    require => [
        Class['apt::update'],
    ],
  }
}

/*===========================================*/

## System
Exec { path => [ "/bin/", "/sbin/" , "/usr/bin/", "/usr/sbin/" ] }

class{'systempackages':}

# APT
class { 'apt':
  update => {
    frequency => 'always',
  },
}
apt::ppa { 'ppa:ondrej/php-7.0':
  before => Package['php7.0-cli'],
  require => Class['systempackages'],
}

# PHP
package {'php7.0-cli':
  ensure => 'installed',
}

循环依赖反映了 Puppet 不是供应系统这一事实。它可以 供应系统使用,也可以与供应系统结合使用,但这取决于在它启动之前是否有相当可观的可用软件堆栈。如果 Package 'software-properties-common' 是 Apt 子系统的全部功能所必需的,那么你最好的选择是依靠你的配置系统来安装它,这样它就可以在 Puppet 运行之前使用,并避免声明它们之间的任何关系包和 Apt 模块的 classes 和资源。

您还受到 puppetlabs-apt 模块的影响,该模块非常善于声明确保应用程序正确顺序所需的关系。然而,这是一把双刃剑:人们通过声明自己与 classes 的关系或该模块中定义的类型与其声明的类型相冲突,从而以惊人的频率给自己带来麻烦。特别是,让您的 Apt::ppa 资源 require 包含本身 require 任何 class 或来自 Apt 模块的资源的 class 是自找麻烦。

无论如何,class apt::update is not a public class of the module。主要含义是模块外部的代码不应该以任何方式引用它。您应该改为依赖为 class 参数 $apt::update 提供的值来指示 Puppet 在合适的时间执行 apt-get update

鉴于这是在 vagrant 上,我建议手动安装软件包 software-properties-common 作为 Vagrantfile 的一部分。

config.vm.provision "shell", inline: "apt-get update && apt-get install software-properties-common 之类的东西应该可以。