Прерывистые проблемы установки apt-get при создании AMI с использованием Packer
Я пытаюсь создать AMI на основе ami-3b054701
в ap-southeast-2
область, край. Конфигурация упаковщика имеет один простой поставщик:
#!/bin/bash -e
info() {
echo -e "[INFO] $1\n"
}
exec_cmd() {
echo -e "\n[INFO] $1\n"
eval $1
}
exec_cmd "apt-get update"
exec_cmd "apt-get -y upgrade"
exec_cmd "apt-get -y install build-essential git zip unzip wget default-jre"
Иногда это работает без проблем, но иногда происходит сбой с этой ошибкой:
ami: [INFO] apt-get -y install build-essential git zip unzip wget default-jre
ami:
ami: Reading package lists... Done
ami: Building dependency tree
ami: Reading state information... Done
ami: Package build-essential is not available, but is referred to by another package.
ami: This may mean that the package is missing, has been obsoleted, or
ami: is only available from another source
ami:
ami: Package default-jre is not available, but is referred to by another package.
ami: This may mean that the package is missing, has been obsoleted, or
ami: is only available from another source
ami:
ami: Package zip is not available, but is referred to by another package.
ami: This may mean that the package is missing, has been obsoleted, or
ami: is only available from another source
ami:
ami: E: Package 'build-essential' has no installation candidate
ami: E: Package 'zip' has no installation candidate
ami: E: Package 'default-jre' has no installation candidate
Я потратил один полный день, чтобы найти способ избежать этого. На Stack Exchange есть предлагаемое решение, но это скорее взлом, чем решение. Есть ли способ предотвратить прерывание этой ошибки?
Вот полный вывод Packer
==> ami: Prevalidating AMI Name...
==> ami: Inspecting the source AMI...
==> ami: Creating temporary keypair: packer 55d33324-e319-bd49-24c5-c06a18b4fe09
==> ami: Launching a source AWS instance...
ami: Instance ID: i-8b78cd55
==> ami: Waiting for instance (i-8b78cd55) to become ready...
==> ami: Waiting for SSH to become available...
==> ami: Connected to SSH!
==> ami: Provisioning with shell script: scripts/provision.sh
ami:
ami: [INFO] apt-get update
ami:
ami: Ign http://security.ubuntu.com trusty-security InRelease
ami: Ign http://archive.ubuntu.com trusty InRelease
ami: Get:1 http://security.ubuntu.com trusty-security Release.gpg [933 B]
ami: Ign http://archive.ubuntu.com trusty-updates InRelease
ami: Get:2 http://security.ubuntu.com trusty-security Release [63.5 kB]
ami: Hit http://archive.ubuntu.com trusty Release.gpg
ami: Get:3 http://archive.ubuntu.com trusty-updates Release.gpg [933 B]
ami: Hit http://archive.ubuntu.com trusty Release
ami: Get:4 http://archive.ubuntu.com trusty-updates Release [63.5 kB]
ami: Get:5 http://security.ubuntu.com trusty-security/main amd64 Packages [333 kB]
ami: Get:6 http://security.ubuntu.com trusty-security/restricted amd64 Packages [8875 B]
ami: Hit http://archive.ubuntu.com trusty/main amd64 Packages
ami: Get:7 http://security.ubuntu.com trusty-security/universe amd64 Packages [114 kB]
ami: Hit http://archive.ubuntu.com trusty/restricted amd64 Packages
ami: Hit http://archive.ubuntu.com trusty/universe amd64 Packages
ami: Get:8 http://security.ubuntu.com trusty-security/multiverse amd64 Packages [3686 B]
ami: Hit http://archive.ubuntu.com trusty/multiverse amd64 Packages
ami: Get:9 http://security.ubuntu.com trusty-security/main Translation-en [181 kB]
ami: Hit http://archive.ubuntu.com trusty/main Translation-en
ami: Hit http://security.ubuntu.com trusty-security/multiverse Translation-en
ami: Hit http://archive.ubuntu.com trusty/multiverse Translation-en
ami: Hit http://security.ubuntu.com trusty-security/restricted Translation-en
ami: Hit http://archive.ubuntu.com trusty/restricted Translation-en
ami: Get:10 http://security.ubuntu.com trusty-security/universe Translation-en [66.6 kB]
ami: Hit http://archive.ubuntu.com trusty/universe Translation-en
ami: Get:11 http://archive.ubuntu.com trusty-updates/main amd64 Packages [605 kB]
ami: Get:12 http://archive.ubuntu.com trusty-updates/restricted amd64 Packages [15.3 kB]
ami: Get:13 http://archive.ubuntu.com trusty-updates/universe amd64 Packages [308 kB]
ami: Get:14 http://archive.ubuntu.com trusty-updates/multiverse amd64 Packages [11.9 kB]
ami: Get:15 http://archive.ubuntu.com trusty-updates/main Translation-en [292 kB]
ami: Hit http://archive.ubuntu.com trusty-updates/multiverse Translation-en
ami: Hit http://archive.ubuntu.com trusty-updates/restricted Translation-en
ami: Get:16 http://archive.ubuntu.com trusty-updates/universe Translation-en [163 kB]
ami: Fetched 2232 kB in 16s (134 kB/s)
ami: Reading package lists... Done
ami:
ami: [INFO] apt-get -y upgrade
ami:
ami: Reading package lists... Done
ami: Building dependency tree
ami: Reading state information... Done
ami: Calculating upgrade... Done
ami: The following packages have been kept back:
ami: linux-headers-generic linux-headers-virtual linux-image-virtual
ami: linux-virtual
ami: 0 upgraded, 0 newly installed, 0 to remove and 4 not upgraded.
ami:
ami: [INFO] apt-get -y install build-essential git zip unzip wget default-jre
ami:
ami: Reading package lists... Done
ami: Building dependency tree
ami: Reading state information... Done
ami: Package build-essential is not available, but is referred to by another package.
ami: This may mean that the package is missing, has been obsoleted, or
ami: is only available from another source
ami:
ami: Package default-jre is not available, but is referred to by another package.
ami: This may mean that the package is missing, has been obsoleted, or
ami: is only available from another source
ami:
ami: Package zip is not available, but is referred to by another package.
ami: This may mean that the package is missing, has been obsoleted, or
ami: is only available from another source
ami:
ami: E: Package 'build-essential' has no installation candidate
ami: E: Package 'zip' has no installation candidate
ami: E: Package 'default-jre' has no installation candidate
==> ami: Terminating the source AWS instance...
==> ami: No AMIs to cleanup
3 ответа
Скорее всего, вы столкнулись с состоянием гонки с cloud-init. Эта проблема с пакером дает некоторое представление, и я с успехом попробовал следующее предложение, данное ОП:
echo "waiting 180 seconds for cloud-init to update /etc/apt/sources.list"
timeout 180 /bin/bash -c \
'until stat /var/lib/cloud/instance/boot-finished 2>/dev/null; do echo waiting ...; sleep 1; done'
В моем случае добавление текста
/usr/bin/cloud-init status --wait &&
к
execute_command
парень решил проблему,
json файл:
"provisioners" : [
{
"type" : "shell",
"script" : "./setup.sh",
"execute_command" : "/usr/bin/cloud-init status --wait && \
sudo -E -S sh '{{ .Path }}'"
}
]
Это все еще кажется проблемой. Я решил эту проблему, создав копию стандартного образа Ubuntu и поместив на него оболочку apt-get, которая будет ожидать завершения существующих установок, прежде чем продолжить (вместо сбоя).
Шаги для решения
- Войдите в консоль AWS и перейдите на панель инструментов EC2.
- Создайте новый экземпляр с нужным вам образом Ubuntu.
- SSH в новый экземпляр и поставить новый
apt-get
сценарий (см. ниже) в/usr/local/sbin/apt-get
- Сделайте его исполняемым:
sudo chmod 755 /usr/local/sbin/apt-get
- Убедиться, что
/usr/local/sbin/
находится в начале переменной PATH в/etc/environment
- Выход из машины.
- Вернуться в минусы AWS
- Остановите экземпляр ES2: Действия> Состояние экземпляра> Стоп
- Создайте новое изображение из этого экземпляра: Действия> Изображение> Создать изображение
- Используйте сгенерированный AMI для всех новых экземпляров.
Скрипт: apt-get
Скрипт адаптирован из этого
#!/bin/bash
#
# Wait for the package manager locks to be released before trying to call apt-get
#
i=0
tput sc
while fuser /var/lib/dpkg/lock >/dev/null 2>&1 || fuser /var/lib/apt/lists/lock >/dev/null 2>&1; do
case $(($i % 4)) in
0 ) j="-" ;;
1 ) j="\\" ;;
2 ) j="|" ;;
3 ) j="/" ;;
esac
tput rc
echo -en "\r[$j] Waiting for other software managers to finish..."
sleep 0.5
((i=i+1))
done
/usr/bin/apt-get "$@"
Я попросил команду серверов взглянуть на это, и пока они разрабатывают ответ, я могу сказать, что решение StackExchange относится к проблемам "несоответствия хэш-суммы", которых нет в ваших выходных данных.
По какой-то причине метаданные архива не совпадают с пакетами, которые вы просите установить (которые находятся в основном), но apt знает, что другие пакеты зависят от них, поэтому он говорит вам, что он не отвечает думаю, ты тоже сумасшедший.;-)