Запустите `apt-get update` перед установкой других пакетов с помощью Puppet

Я пытаюсь создать кукольный модуль, который автоматизирует установку zend-сервера CE, здесь это не важно, но шаги следующие:

  • update/etc/apt/source.list
  • скачать ключ repos через wget
  • сделать apt-get update
  • do 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

Может ли кто-нибудь объяснить мне, что не так?

Ответ 1

Вам нужно указать зависимости. Самый простой/чистый подход - использовать параметр require, который доступен для всех типов ресурсов.

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

и т.д..

Ответ 2

Так как Puppet 2.6.0 новая функция "синтаксис отношений" была представлена ​​.

Пример в Puppet 2.6.0 и выше будет выглядеть так:

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

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

Каждый раз, когда выполняется команда пакета, зависимость (в нашем случае "apt-update" ) запускается кулаком. Вы даже можете определить более длинные цепочки.

Ответ 3

Я попробовал предыдущий вариант, но он не работает для меня на Ubuntu 10.04

Наконец, я подготовил следующий script, который запускает обновление каждый раз, когда репозиторий старше одной недели:

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

Я предпочитаю ставить 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 
}

Проверьте мой образец LAMPP-box на github, чтобы увидеть, как фрагменты подходят друг другу: https://github.com/joerx/vagrant-lampp

Примечание. Будьте осторожны с apt-upgrade, поскольку некоторые базовые поля ломаются в таких вещах, как обновления ядра.

Ответ 6

Добавление этого фрагмента voodoo сработало для нас:

  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'