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

Run `apt-get update` before installing other packages with Puppet

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

  • 更新/etc/apt/source.list
  • 通过wget下载repos密钥
  • 做apt-get update
  • do apt-get install zend-server-ce-5.2
  • 我有init.pp文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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以不同的顺序运行命令然后我需要。 有什么方法告诉他按照我想要的顺序跑吗?

    这样的片段的输出是

    1
    2
    3
    4
    5
    6
    7
    8
      [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

    谁能指导我出错了什么?


    自Puppet 2.6.0以来,引入了一种新功能"关系语法"。

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

    1
    2
    3
    4
    5
    exec {"apt-update":
        command =>"/usr/bin/apt-get update"
    }

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

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


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

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

    等等..


    我尝试过以前的变种,但它在Ubuntu 10.04上对我不起作用

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

    1
    2
    3
    4
    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:

    1
    2
    3
    4
    5
    6
    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中,这可以通过使用资源收集器实现虚拟资源来完成

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 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 <| |>


    添加这个伏都教片段对我们有用:

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

    这迫使了更新。因人而异。


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

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

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

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

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

    如果你正在使用hiera:

    1
    2
    3
    4
    5
    6
    7
    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'