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

Ansible问题排查:如何根据字符串/列表含指定值设置布尔变量

问题:Ansible布尔变量is_cd_host设置不符合预期

在Ansible角色中尝试根据变量pp_srv是否包含"diags"字符串设置布尔变量is_cd_host,但运行后发现cd-host-02的pp_srv不含"diags"时,is_cd_host仍被设为True,与预期不符。

原任务代码

- meta: end_play
  when:
   - pp_srv is not defined

- name: Debug pp_srv splitted.
  debug:
    msg: "pp_srv spilti up is {{ pp_srv.split(',') }}"

- name: Set Monitoring Host
  ansible.builtin.set_fact:
    cd_mon_host: "{{ groups.monitor.0 }}"
  when:
    - cd_mon_host is not defined

- name: Debug Show pp_srv
  debug:
    var: pp_srv

- name: Check Usage - Set is_cd_host to False
  ansible.builtin.set_fact:
    is_cd_host: False

- name: Check Usage - Set is_cd_host to True
  ansible.builtin.set_fact:
    is_cd_host: True
    when:
      - pp_srv | search("diags")

- name: Debug is_cd_host
  debug:
    msg: "is_cd_host is {{ is_cd_host }}"

- name: Assert if
  assert:
    that: false

运行molecule test输出

TASK [example.diags : Debug pp_srv splitted.] ******************
ok: [cd-host-01] => {
    "msg": "pp_srv spilti up is ['all', 'agger', 'esync', 'apiconf', 'diags']"
}
ok: [cd-host-02] => {
    "msg": "pp_srv spilti up is ['apiconf']"
}
ok: [mon-host-01] => {
    "msg": "pp_srv spilti up is ['all', 'apiconf', 'diags']"
}

TASK [example.diags : Set Monitoring Host] ******************
ok: [cd-host-01]
ok: [cd-host-02]
ok: [mon-host-01]

TASK [example.diags : Debug Show pp_srv] ***********************
ok: [cd-host-01] => {
    "pp_srv": "all,agger,esync,apiconf,diags"
}
ok: [cd-host-02] => {
    "pp_srv": "apiconf"
}
ok: [mon-host-01] => {
    "pp_srv": "all,apiconf,diags"
}

TASK [example.diags : Check Usage - Set is_cd_host to False] ***
ok: [cd-host-01]
ok: [cd-host-02]
ok: [mon-host-01]

TASK [example.diags : Check Usage - Set is_cd_host to True] ****
ok: [cd-host-01]
ok: [cd-host-02]
ok: [mon-host-01]

TASK [example.diags : Debug is_cd_host] ************************
ok: [cd-host-01] => {
    "msg": "is_cd_host is True"
}
ok: [cd-host-02] => {
    "msg": "is_cd_host is True"
}
ok: [mon-host-01] => {
    "msg": "is_cd_host is True"
}

错误原因

原代码中缩进错误导致when条件未生效:在"Check Usage - Set is_cd_host to True"任务里,when被缩进在了set_fact的参数内部,而非与name、ansible.builtin.set_fact同级。这相当于没有给该任务添加条件判断,所有主机都会执行这个设置is_cd_host: True的任务,直接覆盖了之前设置的False值。

正确实现方式

用单个set_fact任务,通过表达式直接判断"diags"是否在pp_srv分割后的列表中,一步到位设置变量:

- name: Check Usage - Set is_cd_host.
  ansible.builtin.set_fact:
    is_cd_host: "{{ 'diags' in pp_srv.split(',') }}"

内容的提问来源于stack exchange,提问作者Red Cricket

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:05:49