我正在尝试使用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
但是在第一次运行时,第三个任务会抛出大量的Java错误,包括:Suppressed: java.io.IOException: Server returned HTTP response code: 503 for URL
,这让我觉得Web服务器(完全由Jenkins处理)没有准备好。有时当我使用我的浏览器访问Jenkins仪表板时,它表示Jenkins尚未就绪,并且它会重新加载,而且确实如此,它可以正常工作。但我不确定访问该页面是启动服务器的原因,还是什么。
所以我想我需要多次卷曲,直到http代码为200?还有其他办法吗?
无论哪种方式,我该怎么做?
你如何正常重启詹金斯?
答案 0 :(得分:52)
使用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
答案 1 :(得分:26)
我使用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
答案 2 :(得分:4)
我发现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
答案 3 :(得分:2)
@ 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
答案 4 :(得分: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