Ansible Playbook语法错误:检测变量值时提示无模块/动作
问题原因
你最后那个名为"Failed when"的任务没有指定任何Ansible模块/动作,Ansible要求每个任务必须明确要执行的操作(比如fail、assert等),failed_when只是任务的条件判断属性,不能单独作为任务存在——它需要依附在某个具体的任务动作上。
修正方案
以下是几种符合需求的修正方式:
方案1:使用fail模块触发失败
直接用fail模块配合when条件,当权限数量超过1时抛出错误信息:
- name: 当权限数量大于1时触发失败 fail: msg: "Python的权限数量超过1个,当前数量: {{ num_capabilities }}" when: num_capabilities | int > 1
方案2:使用assert模块做断言检查(推荐)
assert模块更适合这类校验场景,语义更清晰:
- name: 检查权限数量不超过1个 assert: that: - num_capabilities | int <= 1 fail_msg: "Python的权限数量超过1个,当前权限: {{ capabilities }}" success_msg: "Python的权限数量符合要求"
方案3:简化步骤,合并校验逻辑
可以把拆分权限、长度校验和失败判断合并到同一个任务里,减少冗余:
- name: RESCUE | 获取并检查Python权限数量 set_fact: capabilities: "{{ python_capability.stdout.split()[1:] }}" failed_when: capabilities | length > 1
完整修正后的Playbook示例
以方案2为例,完整代码如下:
- hosts: tests become: yes pre_tasks: - block: - name: 确保Python拥有CAP_SYS_NICE权限 capabilities: path: /usr/bin/python3.10 capability: cap_sys_nice+ep state: present register: python_capability rescue: - name: RESCUE | 获取Python的权限列表 set_fact: capabilities: "{{ python_capability.stdout.split()[1:] }}" - name: 检查权限数量不超过1个 assert: that: - capabilities | length <= 1 fail_msg: "Python的权限数量超过1个,当前权限: {{ capabilities }}" success_msg: "Python的权限数量符合要求"
内容的提问来源于stack exchange,提问作者aaron02
相关产品推荐
相关产品推荐

