it-swarm.com.de

Wie kann ich Jenkins mit Ansible neu starten und warten, bis es wieder kommt?

Ich versuche, den Jenkins-Dienst mit Ansible neu zu starten:

- 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

Beim ersten Durchlauf wirft die dritte Aufgabe eine Menge Java-Fehler auf, einschließlich der folgenden: Suppressed: Java.io.IOException: Server returned HTTP response code: 503 for URL. Ich denke, der Webserver (der vollständig von Jenkins gehandhabt wird) war nicht bereit. Wenn ich mit meinem Browser zum Jenkins-Dashboard gehe, heißt es manchmal, dass Jenkins nicht bereit ist und dass es neu geladen wird, wenn es ist und es funktioniert. Ich bin mir jedoch nicht sicher, ob beim Zugriff auf die Seite der Server gestartet wird oder was.

Ich denke, was ich brauche, ist viele Male, bis der http-Code 200 ist. Gibt es einen anderen Weg?

Wie mache ich das?

Wie startet man Jenkins normalerweise neu?

29
ChocoDeveloper

Ich löste es mit curl + Ansibles until, von dem ich gerade erfahren habe. Es fordert die Seite an, bis der http-Statuscode 200 OK ist.

- 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

Verwenden des URI-Moduls 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

Ich habe festgestellt, dass Jenkins immer eine 503-Antwort zurücksendet (Dienst nicht verfügbar), wenn sie aktiv ist, aber noch nicht fertig ist. Der zuverlässigste Weg wäre also, den Antwortcode-Header allein zu isolieren und zu untersuchen. 

- 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

Etwas genauere Version der Antwort von @ ChocoDeveloper. Mit dieser Version können Sie eher nach einem bestimmten Antwortcode suchen als nach dem rohen stdout in der HTTP-Antwort

- 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

Vielleicht hilft das anderen, ich habe versucht, eine ähnliche Sache für verschiedene Dienste zu erreichen. Mein Problem war, dass result.find("200 OK") != -1 oder result.status == 200 in meinem Fall nicht funktionierten.

Das hat für mich funktioniert:

- 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