Ansible when语句OR逻辑异常:GRUB密码任务无法按预期跳过
问题:GRUB密码设置任务的跳过条件组合失效
编写用于生成并设置GRUB随机密码的Ansible Playbook,需求是:
- 传入extra-var(通过
set_grubpassword_skip_jobs变量控制)时跳过任务 - 系统已存在GRUB密码时跳过任务
单独使用任一条件时任务可正常跳过,但用OR连接两个条件后,即使满足任一跳过条件,任务仍会执行,尝试多种语法写法均无效果。
相关代码片段
- name: Merge variable set_grubpassword__skip_jobs ansible.builtin.set_fact: set_grubpassword_skip_jobs: "{{ lookup('community.general.merge_variables', '__skip_jobs', pattern_type='suffix') }}" - name: Check if a GRUB password exists ansible.builtin.lineinfile: dest: /etc/grub.d/00_header line: 'set superusers="root"' state: present check_mode: true register: password_dontexist tasks: - name: Set GRUBPassword block: [...] when: "'set_grubpassword' not in set_grubpassword_skip_jobs" or password_dontexist.changed
尝试过的when语句写法
when: "'set_grubpassword' not in set_grubpassword_skip_jobs" or password_dontexist.changedwhen: ("'set_grubpassword' not in set_grubpassword_skip_jobs") or (password_dontexist.changed)when: (("'set_grubpassword' not in set_grubpassword_skip_jobs") or (password_dontexist.changed))
解决思路
核心问题是逻辑判断写反:
先明确两个跳过条件:
- 条件A:
'set_grubpassword' in set_grubpassword_skip_jobs(传入了跳过的extra-var) - 条件B:
not password_dontexist.changed(GRUB密码已存在,因为lineinfile在check_mode下,若目标行已存在则changed为false)
- 条件A:
需求是满足条件A或B时跳过任务,因此任务的执行条件应该是同时不满足A和B,也就是用
AND连接两个取反后的条件:when: "'set_grubpassword' not in set_grubpassword_skip_jobs and password_dontexist.changed"验证逻辑:
- 若传入了跳过变量(条件A成立):
'set_grubpassword' not in ...为false,整个条件为false,任务跳过 - 若密码已存在(条件B成立):
password_dontexist.changed为false,整个条件为false,任务跳过 - 只有当既没传入跳过变量,且密码不存在时,条件为
true,任务执行
- 若传入了跳过变量(条件A成立):
内容的提问来源于stack exchange,提问作者Théo
相关产品推荐
相关产品推荐

