首页 文章

如何使用Ansible重新启动Jenkins并等待它回来?

提问于
浏览
28

我正在尝试使用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处理)并没有准备就绪,它会重新加载,而且它会重新加载它工作良好 . 但我不确定访问该页面是启动服务器的原因,还是什么 .

所以我想我需要多次卷曲直到http代码为200?还有其他方法吗?

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

你通常如何重启詹金斯?

5 回答

  • 46

    使用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
    
  • 24

    我用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

    我发现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
    
  • 0

    稍微更准确的@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
    
  • 3

    也许这会帮助别人,我试图为不同的服务实现类似的东西 . 我遇到的问题是 result.find("200 OK") != -1result.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
    

相关问题