32

我正在尝试使用 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?还有其他方法吗?

无论哪种方式,我该怎么做?

你通常如何重启 Jenkins?

4

5 回答 5

62

使用 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
于 2015-12-30T03:51:39.167 回答
29

我使用 curl + Ansible's 解决了它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
于 2014-05-30T14:44:45.190 回答
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
于 2016-01-26T04:11:01.537 回答
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
于 2015-12-30T02:44:12.360 回答
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
于 2018-05-08T09:11:17.317 回答