Ansible双Playbook执行控制:验证失败终止后续Play
嘿,我来帮你搞定这个Ansible Playbook的需求!完全符合你说的「本地验证不通过就终止,通过才执行远程操作」的逻辑,下面是具体的实现代码和关键说明:
完整Playbook示例
--- # Play1: 本地验证阶段 - name: Perform local validation checks hosts: localhost connection: local gather_facts: false tasks: - name: Verify process.tar.gz exists locally stat: path: ./process.tar.gz # 替换成你实际的文件路径 register: local_tar_file - name: Halt execution if tar file is missing fail: msg: "Error: process.tar.gz not found in local directory! Aborting all further plays." when: not local_tar_file.stat.exists # 可以在这里添加更多本地验证步骤,比如检查配置文件、权限等 - name: Additional validation example - check config file stat: path: ./deploy_config.ini register: config_file - name: Fail if config file is missing msg: "Error: deploy_config.ini not found! Aborting." fail: when: not config_file.stat.exists # Play2: 远程服务器部署阶段(仅在Play1验证通过后执行) - name: Deploy files to remote servers hosts: your_remote_hosts # 替换成你的远程主机组/列表 gather_facts: true tasks: - name: Create target directory if it doesn't exist file: path: /opt/app/process # 替换成你要创建的远程目录 state: directory mode: '0755' owner: root group: root - name: Copy process.tar.gz to remote servers copy: src: ./process.tar.gz # 本地文件路径,和Play1里的保持一致 dest: /opt/app/process/process.tar.gz # 远程目标路径 mode: '0644'
关键逻辑说明
- Play1的本地执行:通过
hosts: localhost和connection: local强制所有任务在运行Ansible的本地机器上执行,gather_facts: false可以加快执行速度(如果不需要本地系统信息的话)。 - 验证失败终止流程:一旦任何验证任务失败(比如文件不存在),
fail模块会直接让Play1失败。而Ansible的默认行为是:如果前面的Play执行失败,后续所有Play都会自动跳过,这样就完美实现了「验证不通过就不启动Play2」的要求。 - Play2的条件触发:不需要额外加
when条件,因为只有当Play1完全成功(所有验证通过),Play2才会被执行。 - 远程目录创建:
file模块的state: directory会自动创建不存在的目录,同时可以设置权限、属主属组保证安全性。 - 文件复制:
copy模块负责把本地的process.tar.gz推送到远程服务器的指定路径,注意src要和Play1里验证的路径一致,避免出现「验证时存在但复制时找不到」的问题。
可选优化:用变量显式控制流程
如果你希望更灵活地控制Play2的执行(比如需要在多个Play之间传递状态),可以在Play1验证通过后设置一个变量,然后在Play2里用when判断:
# 修改后的Play1 - name: Perform local validation checks hosts: localhost connection: local gather_facts: false tasks: # 前面的验证步骤不变... - name: Set validation passed flag set_fact: validation_successful: true when: local_tar_file.stat.exists and config_file.stat.exists - name: End play if validation failed meta: end_play when: validation_successful is not defined # 修改后的Play2 - name: Deploy files to remote servers hosts: your_remote_hosts gather_facts: true when: validation_successful | default(false) tasks: # 远程操作步骤不变...
这种方式适合复杂场景下的状态传递,但默认的「Play失败自动跳过后续Play」已经能满足你的基础需求啦。
内容的提问来源于stack exchange,提问作者user1950349
相关产品推荐
相关产品推荐

