我尝试使用Vagrant
和Puppet
配置我的开发服务器。下面是我的一些Puppet Manifest。我遇到的问题是,我最终会在依赖循环中结束,这是正确的。唯一的问题是,如果没有这样做,我就没有办法做到这一点,因此我需要一些帮助。
我使用的是名为puppetlabs/ubuntu-14.04-64-puppet
的Puppetlabs提供的最新版本的盒子。将PPA添加到包管理器时,我收到apt-add-repository
不可用的错误。因此,您需要安装software-properties-common
包。
唯一的问题是在安装此软件包之前,您需要运行apt-get update。第二个问题是清单不会接受它,它会尝试在之前添加PPA,因此,当然这是一个逻辑结论,它只需要更新一次包管理器。但是通过选择最后一个解决方案,我将最终进入一个触发错误的循环:
==>默认值:错误:无法应用目录:找到1依赖循环: ==> default:(exec [add-apt-repository-ppa:ondrej / php-7.0] => Class [Apt :: Update] => Exec [apt_update] => Class [Apt :: Update] => 包[git] =>类[Systempackages] => APT :: PPA [PPA:的Ondrej / PHP-7.0] =>执行[附加的apt-库-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',
}
答案 0 :(得分:1)
循环依赖反映了Puppet不是供应系统的事实。它可以通过配置系统使用,也可以与配置系统一起使用,但它依赖于一个相当实质的软件堆栈,可以在它开始之前使用。如果Package' software-properties-common'对于Apt子系统的完全运行是必要的,那么你最好的选择是依靠你的配置系统来安装它,以便在Puppet运行之前它可用,并避免声明该包与类和资源之间的任何关系。 Apt模块。
您还受到puppetlabs-apt模块的影响,该模块非常适合声明确保正确应用顺序所需的关系。然而,这是一把双刃剑:人们通过声明自己与该模块中的类或定义类型的关系而与其声明的自身发生冲突,从而以惊人的频率使自己陷入困境。特别是,要求您的Apt::ppa
资源require
包含自己require
来自Apt模块的任何类或资源的资源,这会让您感到麻烦。
无论如何,class apt::update
is not a public class of the module。主要含义是模块外部的代码不应以任何方式引用它。您应该依赖为类参数$apt::update
提供的值来指示Puppet在适当的时间执行apt-get update
。
答案 1 :(得分:1)
鉴于这是关于流浪汉的,我建议手动安装包software-properties-common
作为您的Vagrantfile的一部分。
像config.vm.provision "shell", inline: "apt-get update && apt-get install software-properties-common
这样的东西应该有效。