我正在尝试使用预装的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'] }