Ansible中能否将block与with_items结合使用?
解决Ansible Block无法使用with_items且实现Ping校验后执行任务块的问题
问题说明
你有一组服务器,希望先对每台服务器执行Ping校验:Ping成功就执行一组任务,失败则跳过该服务器的所有任务,继续处理下一台。尝试给block添加with_items和when条件(判断ping_result.rc == 0且item.fqdn == inventory_hostname)时,收到错误提示:'with_items' is not a valid attribute for a Block。你想通过给block设置统一的when条件简化playbook,避免给每个任务单独加判断。
解决方案
Ansible的block是任务逻辑分组,本身不支持with_items这类循环属性——因为Ansible会自动按inventory中的主机逐个执行play,不需要额外在block层做循环。正确的实现思路是:
- 先对当前主机执行Ping校验,把结果存到变量里
- 直接给block设置
when条件,基于当前主机的Ping结果判断是否执行块内任务
示例Playbook
- name: 带连通性校验的服务器任务 hosts: all gather_facts: no tasks: - name: 本地执行Ping校验(避免目标机不可达时卡住) command: ping -c 2 "{{ inventory_hostname }}" delegate_to: localhost register: ping_result ignore_errors: yes # Ping失败不终止play,继续后续判断 - name: Ping成功才执行的任务块 block: - name: 示例任务1 - 获取主机名 command: hostname - name: 示例任务2 - 查看磁盘占用 command: df -h # 这里可以添加更多需要执行的任务 when: ping_result.rc == 0
关键说明
delegate_to: localhost:让Ping命令在控制节点执行,目标服务器不可达时不会导致任务挂起ignore_errors: yes:确保Ping失败时,play不会中断,而是继续执行后续的block判断- block上的
when条件:会自动作用于块内所有任务,无需给每个任务单独添加when,完全满足你简化playbook的需求
内容的提问来源于stack exchange,提问作者piercjs
相关产品推荐
相关产品推荐

