使用Puppet从PPA安装软件包


8

我正在尝试自动预配置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
}

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

信息:/ 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插入框中时,尚未安装并运行docker,则apt-get install lxc-docker可以安装它。我究竟做错了什么?我似乎无法使其与多种不同的配置一起使用。

Answers:


13

apt-getapt-get手册页可以很容易地看到,成功返回0,错误返回100 。所以你已经倒退了。您正在使用组合两个命令&&,这意味着第二个命令仅在第一个命令成功完成(返回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']

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


您仍然需要对Exec['apt_update']从PPA安装的软件包进行要求。在Package之前要求PPA不会强制Exec与Package之间的关系。
daxlerod '16

1

这是一个替代的惯用答案,使用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']
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.