web-dev-qa-db-fra.com

Comment redémarrer Jenkins avec Ansible et attendre son retour?

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?

29
ChocoDeveloper

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
25
ChocoDeveloper

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
49
chrism

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
3
akhyar

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
2
Alex

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
0
MMT