You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.changed
  • when: ("'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))

解决思路

核心问题是逻辑判断写反:

  1. 先明确两个跳过条件:

    • 条件A:'set_grubpassword' in set_grubpassword_skip_jobs(传入了跳过的extra-var)
    • 条件B:not password_dontexist.changed(GRUB密码已存在,因为lineinfile在check_mode下,若目标行已存在则changed为false)
  2. 需求是满足条件A或B时跳过任务,因此任务的执行条件应该是同时不满足A和B,也就是用AND连接两个取反后的条件:

    when: "'set_grubpassword' not in set_grubpassword_skip_jobs and password_dontexist.changed"
    
  3. 验证逻辑:

    • 若传入了跳过变量(条件A成立):'set_grubpassword' not in ...为false,整个条件为false,任务跳过
    • 若密码已存在(条件B成立):password_dontexist.changed为false,整个条件为false,任务跳过
    • 只有当既没传入跳过变量,且密码不存在时,条件为true,任务执行

内容的提问来源于stack exchange,提问作者Théo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:59:59