【问题标题】:Run `apt-get update` before installing other packages with Puppet在使用 Puppet 安装其他软件包之前运行 `apt-get update`
【发布时间】:2012-06-06 10:25:14
【问题描述】:

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

  1. 更新 /etc/apt/source.list
  2. 通过 wget 下载 repos 密钥
  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"
}

}

似乎 puppet 运行命令的顺序与我需要的不同。有什么方法可以告诉他按照我想要的顺序运行吗?

这样的sn-p的输出是

  [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

谁能指导我怎么了?

【问题讨论】:

  • 只是指出一个附带问题:当/etc/apt/** 中的文件没有更改时,您的 apt-get 更新将只运行一次并且永远不会再次执行。在安装其他软件包时,这可能会导致更新信息过时。如果 apt-get 更新执行时间超过 1 天,您可能还需要添加此 bash 检查,该检查返回 true:[[ $(( $(date +%s) - $(stat -c %Z /var/cache/apt/pkgcache.bin) )) -gt $(( 24 * 60 * 60 )) ]]
  • 快速记录您的apt-key add 调用。通过 HTTP 获取某些内容然后将其传递给 apt-key 会使您容易受到包括 MITM 在内的各种安全攻击。看起来 zend 不提供对这个密钥的 HTTPS 访问,这是一种耻辱。如果你可以手动验证密钥,那么通过其他方法将其推出会更安全,也许file { ... }
  • 你试过puppetlabs-apt模块来处理repo和keys的管理吗?这与您的问题没有直接关系:)

标签: puppet apt-get zend-server


【解决方案1】:

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

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

等等。

【讨论】:

  • 我读过docs.puppetlabs.com/guides/language_guide.html#run-stages,puppet 提供了阶段,因此您可以明确指定执行顺序。在 Puppet 2.6.0 版本中添加了运行阶段,您现在可以指定任意数量的阶段,这提供了另一种方法来控制 Puppet 中资源管理的顺序。
  • 这可能是“最简单/最干净的”,但它可以维护吗?如果 Exec 需要更改,那么您必须返回并替换每个声明,关键是这种方法没有参考意义。
  • @BrandonCook 然后你可以给你的执行官一个新名字。 exec{update: command => "apt-get update"} 然后将其引用为Exec[update]
  • 如果您为多个 repos 执行此操作,那么您最终可能会比您想要的更多 apt-get updates。 Puppet 的“阶段”是一个需要小心的功能,但这是我所知道的最好的用例。
【解决方案2】:

自 Puppet 2.6.0 以来,一个新功能“关系语法”是introduced

Puppet 2.6.0 及更高版本中的示例如下所示:

exec { "apt-update":
    command => "/usr/bin/apt-get update"
}

Exec["apt-update"] -> Package <| |>

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

【讨论】:

  • 我实际上是用stage来做这个的,但我不得不承认这个技巧很漂亮!
  • 谢谢,这非常有帮助!对于像我这样想知道最后一行的其他新手:“docs.puppetlabs.com/puppet/3/reference/lang_collectors.html
  • 无论是否需要安装软件包,这似乎都会在每次 puppet 更新时运行。有没有办法加强这一点,以便 apt-get update 仅在系统缺少软件包时运行?
  • @r3cgm 你的包“确保”设置是什么?如果 'ensure' => 'installed' 也发生这种情况,则关系语法可以更改为:Exec["apt-update"] -> Package 但是对于每个非 'ensure => latest' 包,apt-update 将不会运行。
  • 感谢@DrDol!我们已将确保设置为“当前”,但可能很快会转向确保“最新”模型。我认为我们在这里遇到了第 22 条问题。如果我们将 apt-get update 与“ensure == installed”绑定,那么它会在每次查看包是否存在之前运行 apt-get update。这是我们试图避免的原始情况;一直运行 apt-get update。但是,如果我们仅将 apt-get update 与“ensure == latest”绑定,那么每当我们发现丢失的包时,我们就会错过在安装之前执行 apt-get update 并且我们可能会安装旧的东西。
【解决方案3】:

我尝试了以前的变体,但它在 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 ))'"
}

希望对你有帮助。

【讨论】:

    【解决方案4】:

    在 Puppet 3 中,这可以由 realizing virtual resources using resource collectors 完成

    # 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 <| |>
    

    【讨论】:

    • 这在 3.2.4 上对我不起作用,除非我更改为完全合格的路径。 @exec { '/usr/bin/sudo /usr/bin/apt-get update...
    • 好电话我测试了很久以前添加了Exec { path =&gt; ['/usr/bin'] }
    【解决方案5】:

    我更喜欢将 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 时要小心,因为某些基础设备会因内核升级等原因而损坏。

    【讨论】:

    • 太棒了。这是一个我不知道的非常棒的功能。感谢分享。
    • 链接像老鼠一样死了。
    • 修复了链接,但是manifest的相关部分现在被注释掉了。你仍然可以看到它。没有什么是静态的......
    【解决方案6】:

    添加这个 voodoo 的 sn-p 对我们有用:

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

    这强制更新。 YMMV。

    【讨论】:

      【解决方案7】:

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

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

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

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

      【讨论】:

        【解决方案8】:

        您确实应该使用 apt 模块来创建源和添加密钥:https://forge.puppet.com/puppetlabs/apt

        如果您使用的是 hiera:

        apt::sources:
          'artifactory-pro-debs':
            location: 'http://repos.zend.com/zend-server/deb'
            release: 'server
            repos: 'non-free'
            key:
              source: 'http://repos.zend.com/zend.key'
        

        【讨论】:

          猜你喜欢
          • 2014-11-06
          • 2020-12-22
          • 2012-03-04
          • 2013-09-24
          • 2014-01-16
          • 1970-01-01
          • 2019-03-19
          • 2014-06-23
          • 1970-01-01
          相关资源
          最近更新 更多