在使用Puppet安装其他软件包之前运行`apt-get update`

我试图创build自动安装zend服务器CE的puppet模块,这在这里并不重要,但步骤如下

  1. 更新/etc/apt/source.list
  2. 通过wget下载回购密钥
  3. 做apt-get更新
  4. apt-get install zend-server-ce-5.2

我有init.pp文件

 class zendserverce { # https://github.com/puppetlabs/puppetlabs-stdlib file_line { 'debian_package': path => '/etc/apt/sources.list', line => 'deb http://repos.zend.com/zend-server/deb server non-free' } exec { "wget http://repos.zend.com/zend.key -O- |apt-key add -": path => ["/usr/bin", "/usr/sbin"] } exec { "apt-get update": command => "/usr/bin/apt-get update", onlyif => "/bin/sh -c '[ ! -f /var/cache/apt/pkgcache.bin ] || /usr/bin/find /etc/apt/* -cnewer /var/cache/apt/pkgcache.bin | /bin/grep . > /dev/null'", } package { "zend-server-ce-php-5.2": ensure => "latest" } } 

似乎傀儡以不同的顺序运行命令,然后我需要。 有什么方法可以告诉他按我想要的顺序跑步吗?

这样的片段的输出是

  [0;36mnotice: /Stage[main]/Mc/Package[mc]/ensure: ensure changed 'purged' to 'latest'[0m [1;35merr: /Stage[main]/Zendserverce/Package[zend-server-ce-php-5.2]/ensure: change from purged to latest failed: Could not update: Execution of '/usr/bin/apt-get -q -y -o DPkg::Options::=--force-confold install zend-server-ce-php-5.2' returned 100: Reading package lists... Building dependency tree... Reading state information... E: Couldn't find package zend-server-ce-php-5.2 at /tmp/vagrant-puppet/modules 0/zendserverce/manifests/init.pp:28[0m [0;36mnotice: /Stage[main]/Zendserverce/Exec[wget http://repos.zend.com/zend.key -O- |apt-key add -]/returns: executed successfully[0m [0;36mnotice: /Stage[main]/Zendserverce/File_line[debian_package]/ensure: created[0m [0;36mnotice: Finished catalog run in 6.75 seconds[0m 

所以它说:找不到包zend-server-ce-php-5.2

谁能指导我什么是错的?

您需要指定依赖关系。 最简单/最简洁的方法是使用可用于所有资源types的require参数。

 package { "zend-server-ce-php-5.2": ensure => latest, require => Exec['apt-get update'], } 

等等..

由于Puppet 2.6.0 引入了一个新的“关系语法”特性。

Puppet 2.6.0及以上版本的例子如下所示:

 exec { "apt-update": command => "/usr/bin/apt-get update" } Exec["apt-update"] -> Package <| |> 

每次执行包命令时,都会触发依赖项(在我们的例子中为“apt-update”)。 你甚至可以定义更长的链。

我试过以前的变种,但它不适合我在Ubuntu 10.04

最后,我准备了以下脚本,每次存储库超过一周时都会运行更新:

 exec { 'apt-get update': command => "/usr/bin/apt-get update", onlyif => "/bin/bash -c 'exit $(( $(( $(date +%s) - $(stat -c %Y /var/lib/apt/lists/$( ls /var/lib/apt/lists/ -tr1|tail -1 )) )) <= 604800 ))'" } 

希望能帮助到你。

我更喜欢把apt-upgrade放到主舞台之前的一个单独的阶段,所以我不必硬连线任何依赖。 在这里检查: http : //docs.puppetlabs.com/puppet/2.7/reference/lang_run_stages.html 。

一个简单的例子如下所示。 这意味着你有一个单独的类来做实际的apt-update:

 stage { "init": before => Stage["main"] } class {"apt-update": stage => init, apt_mirror => $apt_mirror } 

在github上查看我的示例LAMPP-box,看看这些部分如何组合在一起: https : //github.com/joerx/vagrant-lampp

注意:要小心apt-upgrade,因为有些基础盒子会像内核升级一样破坏。

在Puppet 3中,这可以通过使用资源收集器实现虚拟资源来完成

 # so you don't have to fully qualify paths to binaries Exec { path => ['/usr/bin'] } # virtual resource @exec { 'sudo apt-get update': tag => foo_update } # realize resource. filter by arbitrary "foo_update" # tag and relate it to all Package resources Exec <| tag == foo_update |> -> Package <| |> 

添加这个巫毒片段为我们工作:

  Apt::Pin <| |> -> Package <| |> Apt::Source <| |> -> Package <| |> 

这迫使更新。 因人而异。

需要更新APT列表的软件包应该需要Class['apt::update']

 package { "zend-server-ce-php-5.2": ensure => "latest", require => Class['apt::update'] } 

如果您使用自定义APT源,请确保正确的sorting:

 Apt::Source['my_source'] -> Class['apt::update']