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
相关产品推荐
相关产品推荐

