J'essaie de redémarrer le service Jenkins en utilisant 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
Mais lors de la première exécution, la troisième tâche génère de nombreuses erreurs Java, dont celle-ci: Suppressed: Java.io.IOException: Server returned HTTP response code: 503 for URL
, ce qui me fait penser que le serveur Web (entièrement géré par Jenkins) n'était pas prêt. Parfois, lorsque je vais dans le tableau de bord Jenkins avec mon navigateur, cela signifie que Jenkins n'est pas prêt et qu'il rechargera à ce moment-là, et tout se passe bien. Mais je ne suis pas sûr si accéder à la page est ce qui démarre le serveur, ou quoi.
Donc, je suppose que ce dont j'ai besoin, c'est de tourner plusieurs fois jusqu'à ce que le code http soit 200? Y-a t'il une autre possibilité?
De toute façon, comment je fais ça?
Comment redémarrez-vous normalement Jenkins?
Je l'ai résolu en utilisant la variable until
de curl + Ansible, que je viens d'apprendre. Il demandera la page jusqu'à ce que le code HTTP soit 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
Utilisation du module 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
J'ai constaté que Jenkins renvoie toujours une réponse 503 (service non disponible) lorsqu'il est opérationnel mais qu'il n'est pas prêt. Donc, le moyen le plus fiable serait d’isoler et d’examiner le seul en-tête de code de réponse.
- 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
Version légèrement plus précise de la réponse de @ ChocoDeveloper. Cette version vous permet de rechercher un code de réponse particulier plutôt que de chercher dans la sortie standard brute de la réponse 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
Peut-être que cela aidera les autres, j'essayais de faire la même chose pour un service différent. Le problème que j'avais était que result.find("200 OK") != -1
ou result.status == 200
ne fonctionnaient pas dans mon cas.
C'est ce qui a fonctionné pour moi:
- 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