Как перезапустить Дженкинса, используя 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? Есть ли другой способ?
В любом случае, как мне это сделать?
Как обычно вы запускаете Jenkins?
Ответы
Ответ 1
Я решил его использовать curl + Ansible until
, о котором я только что узнал. Он запросит страницу до тех пор, пока код статуса http не станет 200.
- 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
Ответ 2
Использование модуля 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
Ответ 3
Я обнаружил, что Дженкинс всегда возвращает ответ 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
Ответ 4
Чуть более точная версия ответа @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
Ответ 5
Может быть, это поможет другим, я пытался добиться аналогичной вещи для другого сервиса. У меня была result.find("200 OK") != -1
что 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
Ответ 6
- name: Wait untils Service URI is available
uri:
url: "{{ waiturl }}"
status_code: 200
register: result
until: result.status == 200
retries: 10
delay: 5