我正在尝试自动配置预装了 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::ppa
apt::ppa
apt-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']
}