如何让Ansible在执行Shipa CLI步骤前验证API服务可用性?
解决Ansible中Shipa API服务就绪检查的问题
当然可以!你遇到的这个问题很常见——虽然负载均衡的IP已经分配完成,但后端的Shipa API服务可能还在启动初始化,直接执行CLI命令自然会因为连接失败报错。咱们可以在执行shipa target add之前,添加一步服务就绪检查,确保API真的能正常响应请求后再继续操作。
下面给你两种实用的解决方案:
方案1:用wait_for模块检查TCP端口可用性
如果只是想先确认目标端口(这里是8081)能正常建立连接,可以用wait_for模块,它会持续尝试连接直到成功,或者达到重试上限:
- name: Wait for Shipa API port 8081 to be reachable wait_for: host: "{{ shipa_api.stdout }}" port: 8081 delay: 10 # 首次检查前先等10秒,避免刚拿到IP就立刻检查 retries: 10 # 最多重试10次 timeout: 120 # 每次连接超时时间设为120秒
方案2:用uri模块验证API端点响应(更可靠)
如果想确保API服务不仅端口开放,还能正常处理业务请求(比如你要调用的证书获取端点),推荐用uri模块直接调用目标API,直到返回成功状态码:
- name: Wait for Shipa API certificates endpoint to be ready uri: url: "https://{{ shipa_api.stdout }}:8081/certificates/ca" method: GET validate_certs: no # 如果是自签名证书,需要关闭证书验证 status_code: 200 # 期望返回的成功状态码 register: api_ready until: api_ready.status == 200 # 循环直到状态码符合预期 retries: 10 delay: 15 # 每次重试间隔15秒
这个方案更贴近实际业务场景,因为它验证的是服务能正常处理请求,而不只是端口开放。
整合到你的现有Playbook
把上面的检查步骤放在Add Shipa as a target on CLI任务之前,完整的Playbook片段如下:
- name: Get Shipa API address shell: kubectl --namespace=shipa-system get svc shipa-ingress-nginx -o jsonpath="{.status.loadBalancer.ingress[0].ip}" environment: TERM: dumb register: shipa_api until: shipa_api.stdout | ipaddr retries: 5 delay: 90 # 选择其中一种检查方式即可 - name: Wait for Shipa API port 8081 to be reachable wait_for: host: "{{ shipa_api.stdout }}" port: 8081 delay: 10 retries: 10 timeout: 120 # 或者用uri模块的检查(注释掉上面的wait_for任务即可启用) # - name: Wait for Shipa API certificates endpoint to be ready # uri: # url: "https://{{ shipa_api.stdout }}:8081/certificates/ca" # method: GET # validate_certs: no # status_code: 200 # register: api_ready # until: api_ready.status == 200 # retries: 10 # delay: 15 - name: Add Shipa as a target on CLI shell: shipa target add {{ cluster_name }} {{ shipa_api.stdout }} -s args: executable: /bin/bash no_log: False
这样调整后,Ansible会先等待API服务完全就绪,再执行后续的CLI命令,就能避免出现“connection refused”的错误了。
内容的提问来源于stack exchange,提问作者user1858059
相关产品推荐
相关产品推荐

