Ansible角色:实现应用启动重试与成功跳转运行逻辑
Ansible角色实现应用启动的重试与流程控制
需求说明
- 启动应用最多重试3次,成功返回"OK",失败返回"NOK"
- 每次启动失败(输出"NOK")时,必须删除
xpto目录,最多尝试3次,3次失败则终止执行 - 启动成功(输出"OK")则跳过目录删除,直接运行应用
- 角色仅包含启动应用、删除目录、运行应用三个核心任务
现有代码(缺少重试与跳转逻辑)
--- - name: Start app command: start app register: result tags: myrole - name: Delete directory xpto if app didn't started ok command: rm -rf xpto when: - result.stdout is search("NOK") tags: myrole - name: Run the application command: app run xpto when: - result.stdout is search("OK") tags: myrole
解决方案代码
以下实现完全满足需求,通过循环重试、状态标记实现每次失败后的目录清理,成功后直接跳转至运行应用任务:
--- - name: Initialize start success flag set_fact: start_success: false tags: myrole - name: Attempt to start app with retries (max 3 times) block: - name: Start app command: start app register: start_result tags: myrole - name: Mark start as successful if output is "OK" set_fact: start_success: true when: start_result.stdout is search("OK") tags: myrole - name: Delete xpto directory on start failure command: rm -rf xpto when: start_result.stdout is search("NOK") tags: myrole # 重试终止条件:启动成功 或 已尝试3次 until: start_success or ansible_loop.index == 3 retries: 3 delay: 2 # 可选,每次重试间隔2秒,可按需调整 loop: "{{ range(3) | list }}" loop_control: extended: true loop_var: dummy tags: myrole - name: Run the application if start succeeded command: app run xpto when: start_success tags: myrole - name: Terminate execution if all attempts failed fail: msg: "Failed to start application after 3 attempts" when: not start_success tags: myrole
逻辑说明
- 状态初始化:用
start_success变量记录启动状态,初始值为false - 循环重试流程:通过
block包裹三个核心任务,循环执行最多3次:- 启动应用后检查输出,若为"OK"则标记启动成功,终止循环
- 若输出为"NOK",立即删除
xpto目录,然后进入下一次重试
- 最终分支处理:
- 启动成功则直接执行运行应用任务
- 3次尝试均失败时,触发
fail任务终止执行
内容的提问来源于stack exchange,提问作者fr0zt
相关产品推荐
相关产品推荐

