Я пытаюсь автоматически подготовить виртуальные машины с предварительно установленным докером.
Мой 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 (я думаю, для успешного обновления apt-get по умолчанию используется 100):
info: / Stage [main] // Apt :: Ppa [ppa: dotcloud / lxc-docker] / Exec [add-apt-repository-ppa: dotcloud / lxc-docker]: планирование обновления Exec [apt_update] примечание: / Stage [main] / Apt :: Update / Exec [apt_update] / returns: выполнено успешно примечание: / Stage [main] / Apt :: Update / Exec [apt_update]: инициировано «обновление» из 1 события
Однако, когда я использую ssh в коробке, докер не установлен и не запущен apt-get install lxc-docker
Затем я могу его установить. Что я делаю не так? Я не могу заставить его работать с множеством различных конфигураций.
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
везде.
А вот альтернативный идиоматический ответ с использованием 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']
}