Вопрос: Установка пакета из 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 возвращает (возвращает 100 по умолчанию для успешного обновления apt-get, я думаю):

Информация:   / Stage [главный] // Апт :: PPA [PPA: dotcloud / LXC-докер] / Exec [надстройка APT-репозиторий 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 Затем я смогу установить его. Что я делаю не так? Я не могу заставить его работать с множеством различных конфигураций.


8
2017-07-28 22:22


Источник




Ответы:


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 и делаете это неправильно. Кукольный игнорирует порядок, в котором вы указываете ресурсы в манифесте, и вместо этого применяет их так, как он считает нужным. Поэтому, чтобы убедиться, что 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 в любом месте.


13
2017-07-29 00:37



Вам все еще нужно Exec['apt_update'] на ваших пакетах, установленных из PPA. Требование PPA перед пакетом не обеспечивает соблюдения отношений между Exec и пакетом. - daxlerod


И вот альтернативный, идиоматический ответ, используя 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']
}

1
2017-08-19 19:22