使用Puppet从PPA安装包

我正在尝试使用预装的docker自动configuration虚拟机。

我的默认init.pp如下所示:

class { 'apt': always_apt_update => true, } package { [ #'build-essential', #'vim', #'curl', #'zsh', #'git-core', #'htop', #'wget', #'linux-image-generic-lts-raring', 'python-software-properties' #'lxc-docker' ]: ensure => 'installed', } apt::ppa { 'ppa:dotcloud/lxc-docker':} # refresh apt source exec { "apt-update": command => "/usr/bin/apt-get update && apt-get install lxc-docker --force-yes", returns => 100 } 

最后一个exec命令返回(我认为返回100是一个成功的apt-get更新的默认值):

info:/ Stage [main] // Apt :: Ppa [ppa:dotcloud / lxc-docker] /exec [add-apt-repository-ppa:dotcloud / lxc-docker]:计划Exec [apt_update] Stage [main] / Apt :: Update / Exec [apt_update] /返回:成功执行通知:/ Stage [main] / Apt :: Update / Exec [apt_update]:从1个事件触发'refresh'

但是,当我SSH入箱泊坞窗没有安装和运行apt-get install lxc-docker我可以安装它。 我究竟做错了什么? 我似乎无法得到它与众多不同的configuration工作。

apt-get在成功时返回0,在错误时返回100,你可以从apt-get手册页很容易地看到。 所以你已经倒退了。 您正在使用&&来结合两个命令,这意味着第二个命令仅在第一个命令成功完成时返回(返回0)。 所以,如果apt-get update返回“100”,就像你错误地期望的那样,第二个命令甚至不会运行。

如果您仔细阅读日志消息,则会看到应用的Exec资源名为“apt_update”,而不是“apt-update”。 前者在apt类中定义,并在应用apt::ppa资源时运行。 后者是您自己的Exec资源,它也会出现在日志输出中,但作为Exec[apt-update] 。 找那个

在任何情况下,你在这里构造的东西都不起作用,因为你试图使用Puppet作为赞美的Shell脚本并做错了。 Puppet会忽略您在清单中指定资源的顺序,而是以它认为合适的方式应用它们。 因此,要确保从指定的PPA安装lxc-docker软件包,您需要确保在软件包资源之前应用了PPA资源。

有几种方法可以做到这一点,所有这些方法都涉及到指定关系或依赖关系。 以下是一种使用链式箭头的方法 :

 class { 'apt': always_apt_update => true, } apt::ppa { 'ppa:dotcloud/lxc-docker':} # Your regular packages don't know or care about the PPA package { [ 'build-essential', 'vim', 'curl', 'zsh', 'git-core', 'htop', 'wget', 'linux-image-generic-lts-raring', 'python-software-properties' ]: ensure => 'installed', } # We single lxc-docker out to be able to specify # the relationship to Apt::Ppa properly package { 'lxc-docker': ensure => 'installed' } Apt::Ppa['ppa:dotcloud/lxc-docker'] -> Package['lxc-docker'] 

这意味着在应用PPA“ppa:dotcloud / lxc-docker”的apt::ppa资源之后将应用lxc-docker包资源。 正如所解释的, apt::ppa资源已经在添加PPA后更新APTcaching,所以不需要在任何地方显式调用apt-get update

以下是使用require的另一个习惯性答案:

 class { 'apt': always_apt_update => true, } apt::ppa { 'ppa:dotcloud/lxc-docker':} package { [others]: } package { 'lxc-docker': ensure => 'installed', require => Apt::Ppa['ppa:dotcloud/lxc-docker'] }