使用 Puppet 从 PPA 安装软件包

使用 Puppet 从 PPA 安装软件包

我正在尝试自动配置预装了 Docker 的虚拟机。

我的默认 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 update 成功的默认值):

信息:/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 个事件触发“刷新”

但是当我通过 ssh 进入尚未安装并正在运行的机器时,apt-get install lxc-docker我可以安装它。我做错了什么?我似乎无法让它在多种不同的配置下工作。

答案1

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']

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

答案2

下面是一个替代的惯用答案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']
}

相关内容