在使用Puppet安装其他软件包之前,请运行“apt get update”

在使用Puppet安装其他软件包之前,请运行“apt get update”,puppet,apt-get,zend-server,Puppet,Apt Get,Zend Server,我正在尝试创建puppet模块,它自动安装zend server CE,这在这里并不重要,但步骤如下 更新/etc/apt/source.list 通过wget下载repos密钥 你能得到最新消息吗 是否安装zend-server-ce-5.2 我有init.pp文件 class zendserverce { # https://github.com/puppetlabs/puppetlabs-stdlib file_line { 'debian_package': path =>

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

  • 更新/etc/apt/source.list
  • 通过wget下载repos密钥
  • 你能得到最新消息吗
  • 是否安装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包


    有谁能告诉我出了什么问题吗?

    您需要指定依赖关系。最简单/最干净的方法是使用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 <| |>
    
    exec{“apt更新”:
    命令=>“/usr/bin/apt获取更新”
    }
    Exec[“apt更新”]->软件包
    
    每次执行包命令时,都会首先触发依赖项(在本例中为“apt更新”)。
    您甚至可以定义更长的链。

    我尝试了上一个版本,但在Ubuntu 10.04上它对我不起作用

    最后,我准备了以下脚本,该脚本在存储库的每一周以上时都会运行update:

    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 ))'"
    }
    
    exec{'apt get update':
    命令=>“/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)))在Puppet 3中,这可以由

    #因此您不必完全限定二进制文件的路径
    Exec{path=>['/usr/bin']}
    #虚拟资源
    @exec{'sudo apt get update':
    tag=>foo\u更新
    }
    #通过任意“foo_更新”实现资源过滤
    #标记并将其与所有包资源关联
    执行->程序包
    
    我更喜欢将apt升级放在主阶段之前运行的一个单独的阶段中,这样我就不必硬连接任何依赖项。检查此处:

    一个简单的例子如下所示。这意味着您有一个单独的类来执行实际的apt更新:

    stage { "init": before  => Stage["main"] }
    
    class {"apt-update": 
      stage => init, 
      apt_mirror => $apt_mirror 
    }
    
    在github上查看我的示例LAMPP框,以了解这些部件是如何装配在一起的:


    注意:使用apt升级时要小心,因为有些基本框会被内核升级之类的东西打破。

    添加这段伏都教代码对我们很有用:

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

    这迫使更新.YMMV。

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

    package { "zend-server-ce-php-5.2":
       ensure => "latest",
       require => Class['apt::update']
    }
    
    如果您使用的是自定义APT源,请确保正确排序:

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

    您应该真正使用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'
    

    也许这有助于指出一个次要问题:当
    /etc/apt/**
    中的文件未更改时,您的apt get更新将只运行一次,并且永远不会再次执行。这可能会导致在安装其他软件包时更新信息过时。如果apt get更新执行的次数超过韩1天前:
    [[$($(日期+%s)-$(stat-c%Z/var/cache/apt/pkgcache.bin))-gt$((24*60*60))]
    关于您的
    apt key add
    调用的快速说明。通过HTTP获取某些内容,然后将其传递给
    apt key
    会使您容易受到各种安全攻击,包括MITM。zend似乎不提供对该密钥的HTTPS访问,这是一个耻辱。如果您可以手动验证该密钥,则推送该密钥会更安全通过另一种方法,可能是
    文件{…}
    您是否尝试了puppetlabs apt模块来处理回购和密钥的管理?这与您的问题没有直接关系:)I read和puppet提供了阶段,因此您可以显式指定执行顺序。运行阶段是在puppet版本2.6.0中添加的,现在您可以指定任意数量的阶段,这些阶段提供了另一种方法来控制puppet中资源管理的顺序。这可能是“最简单/最干净的”“但是它是可维护的吗?如果Exec需要更改,那么您必须返回并替换每个声明,重点是这种方法不是引用的。@BrandonOK,那么您可以给Exec一个新名称。
    Exec{update:command=>“apt get update”}
    然后将其引用为
    Exec[update]
    。如果你为多个回购协议这么做,那么你可能会做更多的
    获取更新的
    s,而不是你想要的。Puppet的“阶段”是一个需要小心的特性,但这是我所知道的最好的用例。我实际上使用了stage,但我必须承认这个技巧非常漂亮!谢谢,这非常有用!对于像我这样的新手来说,想知道最后一行:“无论是否需要安装软件包,这似乎都会在每个puppet更新上运行。是否有办法加强这一点,使apt get update仅在系统缺少软件包时运行?@r3cgm您的软件包‘确保’设置是什么?如果‘确保’=>‘已安装’也发生这种情况,则关系语法可以更改为:Exec。”[“apt update”]->软件包,但对于每个非“Sure=>latest”软件包,apt update将不会运行。谢谢@DrDol!我们已将Sure设置为“present”,但可能很快就会转向“Sure”“latest”模型。我想我们这里有一个第22条军规问题。如果我们将apt get update与“Sure==installed”绑定“然后它将在查看包是否存在之前每次运行apt get update。这是我们试图避免的原始场景;一直运行apt get update。但是如果我们将apt get update绑定到“确保==最新”只有这样,当我们发现一个丢失的包时,我们才会错过在安装之前进行apt get更新的机会,我们可能会安装一些旧的。这对我在3.2.4上不起作用,除非我改为完全限定路径。
    @exec{'/usr/bin/sudo/u
    
    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'