Как перезапустить Jenkins с помощью Ansible и дождаться его возвращения?

Я пытаюсь перезапустить службу Jenkins с помощью Ansible:

- name: Restart Jenkins to make the plugin data available
  service: name=jenkins state=restarted

- name: Wait for Jenkins to restart
  wait_for:
    host=localhost
    port=8080
    delay=20
    timeout=300

- name: Install Jenkins plugins
  command:
    java -jar {{ jenkins_cli_jar }} -s {{ jenkins_dashboard_url }} install-plugin {{ item }}
    creates=/var/lib/jenkins/plugins/{{ item }}.jpi
  with_items: jenkins_plugins

Но при первом запуске третья задача выдает множество ошибок Java, включая эту: Suppressed: java.io.IOException: Server returned HTTP response code: 503 for URL, что заставляет меня думать, что веб-сервер (полностью управляемый Дженкинсом) не был готов. Иногда, когда я захожу на панель инструментов Jenkins с помощью своего браузера, он говорит, что Jenkins не готов и что он перезагрузится, когда будет готов, и он работает нормально. Но я не уверен, что доступ к странице запускает сервер или что.

Итак, я думаю, что мне нужно много раз свернуться, пока код http не станет 200? Есть ли другой способ?

В любом случае, как мне это сделать?

Как вы обычно перезапускаете Дженкинса?


person ChocoDeveloper    schedule 28.05.2014    source источник
comment
Тому, кто проголосовал за то, чтобы закрыть это как оффтоп: я пытаюсь настроить сервер непрерывного развертывания для своей команды разработчиков с помощью этих инструментов, а теги уже существуют. Как вы можете говорить, что это не про программирование? Как вы думаете, было бы нормально, если бы я вместо этого использовал Bash?   -  person ChocoDeveloper    schedule 28.05.2014
comment
вы можете перезапустить Jenkins вслепую, а затем использовать wait_for, пока он не восстановится. У меня есть wait_for_http, который лучше, но я еще не сделал для него запрос на извлечение.   -  person tedder42    schedule 29.05.2014
comment
@tedder42 tedder42 В коде, который я разместил, уже есть wait_for. И сервис уже встал после первого задания. Что не в порядке, так это веб-часть, и я не знаю, как ее дождаться. Я думаю, мне нужно что-то вроде этого wait_for_http, о котором вы упомянули.   -  person ChocoDeveloper    schedule 29.05.2014
comment
извините, вы правы, вам нужно wait_for_http, потому что порт работает, хотя сервис не работает. напишите мне, и я могу дать вам кое-что, что можно добавить в вашу библиотеку для бета-тестирования. (и да, я мог бы поставить это как ответ, просто нужно отполировать его)   -  person tedder42    schedule 29.05.2014


Ответы (5)


Использование модуля URI http://docs.ansible.com/ansible/uri_module.html

   - name: "wait for ABC to come up"
     uri:
       url: "http://127.0.0.1:8080/ABC"
       status_code: 200
     register: result
     until: result.status == 200
     retries: 60
     delay: 1
person chrism    schedule 30.12.2015

Я решил это, используя curl + Ansible until, о котором я только что узнал. Он будет запрашивать страницу до тех пор, пока код состояния http не станет 200 OK.

- name: Wait untils Jenkins web API is available
  shell: curl --head --silent http://localhost:8080/cli/
  register: result
  until: result.stdout.find("200 OK") != -1
  retries: 12
  delay: 5
person ChocoDeveloper    schedule 30.05.2014

Я обнаружил, что Jenkins всегда возвращает ответ 503 (Сервис недоступен), когда он работает, но не готов. Таким образом, наиболее надежным способом было бы изолировать и изучить только заголовок кода ответа.

- name: Wait until Jenkins web interface is available
  wait_for: "host={{ jenkins_host }} port={{ jenkins_port }} state=present delay=5 timeout=300"

- name: Wait until Jenkins web interface is ready
  command: 'curl -s -o /dev/null -w "%{http_code}" http://{{ jenkins_host }}:{{ jenkins_port}}/cli/'
  register: result
  until: 'result.stdout[0] in ["2", "3"]' # 2xx or 3xx status code
  retries: 50
  delay: 3
  changed_when: false
person akhy    schedule 26.01.2016

Чуть более точная версия ответа @ChocoDeveloper, в этой версии вы можете проверить конкретный код ответа, а не искать необработанный стандартный вывод из ответа HTTP.

- name: "wait for ABC to come up"
  shell: "curl --silent -o /dev/null -w '%{http_code}' http://127.0.0.1:8080/ABC"
  register: result
  until: result.stdout.find("401") != -1
  retries: 60
  delay: 1
person Alex    schedule 30.12.2015

Возможно, это поможет другим, я пытался добиться аналогичного результата для другого сервиса. Проблема заключалась в том, что result.find("200 OK") != -1 или result.status == 200 в моем случае не работали.

Это то, что сработало для меня:

- name: wait for service to boot
  uri:
    url: "https://10.221.54.18"
    status_code: 200
    validate_certs: False
  register: result
  until: result | succeeded
  retries: 8
  delay: 20
person MMT    schedule 08.05.2018