Можно ли отложить подключение jenkins к ведомому устройству до запуска сценария облачной инициализации
У меня есть скрипт инициализации в облаке
#cloud-config
package_upgrade: true
packages:
- openjdk-8-jdk
- apt-transport-https
- git
- jq
groups:
- docker
users:
- default
- name: jenkins
groups: docker
homedir: /var/lib/jenkins
lock_passwd: true
ssh_authorized_keys:
- ssh-rsa xyz
Который предоставляется плагину jenkins ec2 при запуске Ubuntu 18.04 AMI.
Когда jenkins пытается соединиться с экземпляром, логи показывают:
ИНФОРМАЦИЯ: Проверка: java -fullversion sh: 1: java: не найден
01 ноября 2018 20:22:10 ноль ИНФОРМАЦИЯ: Установка: sudo yum install -y java-1.8.0-openjdk.x86_64 sudo: tty отсутствует и не задана программа askpass
01 ноября 2018 20:22:10 null ВНИМАНИЕ: Не удалось установить: sudo yum install -y java-1.8.0-openjdk.x86_64
sh: 1: java: не найдено ОШИБКА: невозможно запустить агент для Ubuntu 18.04 (i-xxx) java.io.EOFException: неожиданное завершение потока
Если я попытаюсь подключиться к агенту вручную через некоторое время (2/3 минуты), все в порядке:
Агент успешно подключен и онлайн
Должен ли скрипт cloud-init запускаться перед SSH-соединением?
У меня никогда не было этой проблемы при использовании Amazon Linux AMI, где я устанавливаю Java 8 таким же образом (через сценарий инициализации в облаке). Это что-то особенное в том, как amazon linux запускает облачные скрипты инициализации против ubuntu?
1 ответ
В конце концов я решил, что проще установить java и создать новый AMI, чтобы полностью избежать этой проблемы.
Я думаю, что, возможно, мои ожидания, что облачный init будет полностью запущен до подключения, могут быть неверными, в основном из-за этого комментария в документации
Дайте экземпляру достаточно времени для запуска и выполнения директив в ваших пользовательских данных, а затем проверьте, что ваши директивы выполнили поставленные задачи.
Возможно, один из способов помочь решить эту проблему может состоять в том, чтобы остановить sshd
в командах запуска, пока все устанавливается, а затем запускает его снова, когда все готово, надеюсь, что Jenkins подключится только после того, как все будет готово.