由于缺少 OS 包,Pupppet 配置期间的依赖循环
Dependency loop during Pupppet provisioning due missing OS package
我正在尝试使用 Vagrant
和 Puppet
配置我的开发服务器。下面是我此时的一些 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
之类的东西应该可以。
我正在尝试使用 Vagrant
和 Puppet
配置我的开发服务器。下面是我此时的一些 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
之类的东西应该可以。