私はAnsibleを使用してJenkinsサービスを再起動しようとしています:
- 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
しかし、最初の実行では、3番目のタスクはJavaエラーを大量にスローします:Suppressed: Java.io.IOException: Server returned HTTP response code: 503 for URL
。これにより、Webサーバー(Jenkinsが完全に処理)の準備ができていなかったように思えます。ブラウザを使用してJenkinsダッシュボードにアクセスすると、Jenkinsの準備ができていないと表示されることがあります。しかし、ページへのアクセスがサーバーを起動するものなのか、それとも何なのかはわかりません。
だから、httpコードが200になるまで何度もカールする必要があると思いますか?他の方法はありますか?
いずれにせよ、どうすればそれができますか?
Jenkinsを通常どのように再起動しますか?
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
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
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
@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
たぶんこれは他の人を助けるだろう、私は異なるサービスに対して同様のことを達成しようとしていた。私が抱えていた問題は、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