Установка пакета из PPA с помощью Puppet

8

Я пытаюсь автоматически подготовить виртуальные машины с предустановленным докером.

Мой стандартный init.pp выглядит так:

class { 'apt':
 always_apt_update    => true,
}

package { [
    #'build-essential',
    #'vim',
    #'curl',
    #'zsh',
    #'git-core',
    #'htop',
    #'wget',
    #'linux-image-generic-lts-raring',
    'python-software-properties'
    #'lxc-docker'
  ]:
  ensure  => 'installed',
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

# refresh apt source
exec { "apt-update":
  command => "/usr/bin/apt-get update && apt-get install lxc-docker --force-yes",
  returns => 100
}

Последняя команда exec возвращает (возвращение 100 по умолчанию для успешного обновления apt-get, я думаю):

info: / Stage [main] // Apt :: Ppa [ppa: dotcloud / lxc-docker] / Exec [add-apt-repository-ppa: dotcloud / lxc-docker]: Планирование обновления уведомления Exec [apt_update]: / Этап [main] / Apt :: Update / Exec [apt_update] / возвращает: успешно выполнено уведомление: / Stage [main] / Apt :: Update / Exec [apt_update]: вызвано «обновление» из 1 события

Однако, когда я ssh в окно Docker не установлен и работает, apt-get install lxc-dockerя могу установить его. Что я делаю неправильно? Я не могу заставить его работать с множеством разных конфигураций.

цифровой
источник

Ответы:

13

apt-getвозвращает 0 при успехе и 100 при ошибке, как вы можете легко увидеть на apt-getстранице руководства . Итак, вы получили это задом наперед. Вы комбинируете две команды, используя &&, что означает, что вторая команда запускается только тогда, когда первая завершается успешно (возвращает 0). Так что, если apt-get updateвы вернете «100», как вы ошибочно ожидаете, вторая команда даже не запустится.

И если вы внимательно прочитаете сообщение журнала, то увидите, что примененный ресурс Exec называется «apt_update», а не «apt-update». Первый определяется в aptклассе и запускается при применении apt::ppaресурса. Последний является вашим собственным ресурсом Exec, который также будет отображаться в журнале, но как Exec[apt-update]. Ищите это.

В любом случае, то, что вы создали здесь, не работает, потому что вы пытаетесь использовать Puppet в качестве прославленного скрипта Shell и делаете это неправильно. Puppet игнорирует порядок, в котором вы указываете ресурсы в манифесте, и вместо этого применяет их так, как считает нужным. Таким образом, чтобы убедиться, что lxc-dockerпакет установлен с указанного PPA, необходимо убедиться, что ресурс PPA применяется перед ресурсом пакета.

Есть несколько способов сделать это, все из которых включают указание отношений или зависимостей. Вот один из способов, используя цепочки стрелок :

class { 'apt':
 always_apt_update => true,
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

# Your regular packages don't know or care about the PPA
package { [
    'build-essential',
    'vim',
    'curl',
    'zsh',
    'git-core',
    'htop',
    'wget',
    'linux-image-generic-lts-raring',
    'python-software-properties'
  ]:
  ensure  => 'installed',
}

# We single lxc-docker out to be able to specify 
# the relationship to Apt::Ppa properly
package { 'lxc-docker':
  ensure => 'installed'
}

Apt::Ppa['ppa:dotcloud/lxc-docker'] ->
Package['lxc-docker']

Это означает, что lxc-dockerресурс пакета будет применен после того, как был применен apt::ppaресурс для PPA «ppa: dotcloud / lxc-docker». Как объяснено, apt::ppaресурс уже заботится об обновлении кэша APT после добавления PPA, поэтому нет необходимости явно вызывать apt-get updateгде-либо.

Дафф
источник
Вам все еще нужно требовать, чтобы Exec['apt_update']ваши пакеты были установлены из PPA. Требование PPA до того, как Пакет не навязывает отношения между Exec и Пакетом.
Дакслерод
1

И вот альтернативный, идиоматический ответ, используя require:

class { 'apt':
 always_apt_update => true,
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

package { [others]: }    

package { 'lxc-docker':
  ensure  => 'installed',
  require => Apt::Ppa['ppa:dotcloud/lxc-docker']
}
msanford
источник