使用 Puppet 从 PPA 安装包

dig*_*tal 8 puppet vagrant

我正在尝试使用预安装的 docker 自动配置 VM。

我的默认 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
}
Run Code Online (Sandbox Code Playgroud)

最后一个 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]/returns: 执行成功通知:/Stage[main]/Apt::Update/Exec[apt_update]: 从 1 个事件触发 'refresh'

但是,当我 ssh 进入盒子时,docker 没有安装并运行,apt-get install lxc-docker然后我可以安装它。我究竟做错了什么?我似乎无法让它与多种不同的配置一起工作。

daf*_*aff 13

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 会忽略您在清单中指定资源的顺序,而是以它认为合适的方式应用它们。因此,要确保lxc-docker从指定的 PPA 安装包,您需要确保在包资源之前应用 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']
Run Code Online (Sandbox Code Playgroud)

这意味着lxc-docker将在应用apt::ppaPPA 资源“ppa:dotcloud/lxc-docker”后应用包资源。如前所述apt::ppa,在添加 PPA 后,资源已经负责更新 APT 缓存,因此无需在apt-get update任何地方显式调用。