Ansible条件语句含Jinja2模板分隔符的警告消除方法咨询
Ansible条件语句含Jinja2模板分隔符的警告消除方法咨询
嗨,我懂你现在的烦恼——playbook明明能正常跑,但那个模板分隔符的警告看着特别碍眼,肯定想把它彻底解决对吧?咱们一步步来搞定这个问题!
首先得搞清楚警告的根源:你的when条件里不该套Jinja2的{{ }}分隔符,因为when本身就处于Jinja2的解析上下文里,直接写变量和表达式就行,额外加分隔符反而会触发警告。
咱们先看修正后的playbook,再给你拆解改动点:
- hosts: localhost become: no gather_facts: true vars: component: firewalld tasks: - name: Populate service facts ansible.builtin.service_facts: - name: "servicestatus" debug: msg: "{{ component }} is running, do stuff" when: ansible_facts.services[component + '.service'].state == "running" - name: "wokka" debug: var: ansible_facts.services[component + '.service'].state
关键改动说明:
- 去掉条件里的
{{ }}:在when字段里直接用component + '.service'拼接服务名,不用再套模板分隔符,因为这里本身就是Jinja2的执行环境 - 直接访问字典项:用方括号包裹拼接后的表达式,就能正确获取
ansible_facts.services里对应的服务状态了
现在运行这个修正后的playbook,警告就会消失,功能和之前完全一致,运行结果大概是这样:
PLAY [localhost] ************************************************************************************************** TASK [Gathering Facts] ******************************************************************************************** ok: [localhost] TASK [Populate service facts] ************************************************************************************* ok: [localhost] TASK [servicestatus] ********************************************************************************************** ok: [localhost] => { "msg": "firewalld is running, do stuff" } TASK [wokka] ****************************************************************************************************** ok: [localhost] => { "ansible_facts.services[component + '.service'].state": "running" } PLAY RECAP ******************************************************************************************************** localhost : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
如果你觉得拼接表达式有点繁琐,还可以提前把服务名存成一个变量,让代码更清爽:
- hosts: localhost become: no gather_facts: true vars: component: firewalld service_name: "{{ component }}.service" tasks: - name: Populate service facts ansible.builtin.service_facts: - name: "servicestatus" debug: msg: "{{ component }} is running, do stuff" when: ansible_facts.services[service_name].state == "running" - name: "wokka" debug: var: ansible_facts.services[service_name].state
这种写法同样能消除警告,而且在需要多次引用服务名的场景下,可读性会更好。
备注:内容来源于stack exchange,提问作者Nifle
相关产品推荐
相关产品推荐

