Назад | Перейти на главную страницу

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

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

Мой 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']
}