Ansible Playbook中set_facts的或条件失效问题求助
问题原因分析
你遇到的问题核心是变量类型不匹配:当你通过ansible-playbook的-e参数传递stage=1时,Ansible默认会把stage解析为字符串类型(值为"1"),但你在set_fact里是和数字类型的1、2做相等比较——字符串和数字永远不相等,所以test_case_1和test_case_2都被设置为false,导致所有带when条件的任务都被跳过。
修复方案
有两种可靠的修复方式,推荐第一种(兼容性更好,避免后续踩坑):
方案1:修改比较逻辑为字符串匹配
直接把set_fact里的数字比较改成字符串比较,适配命令行传参的默认类型:
- name: test hosts: localhost tasks: - name: setting the level set_fact: test_case_1: "{{ stage == '1' }}" # 改为字符串'1' test_case_2: "{{ stage == '1' or stage == '2' }}" # 改为字符串'1'和'2' - name: "running ls command" shell: "ls -l" register: testing when: - test_case_1 == true - debug: msg: "{{ testing.stdout_lines }}" when: - test_case_1 == true - name: "kickoff" shell: "df -Th" register: kick when: - test_case_2 == true - name: "printing kickoff" debug: msg: "{{ kick.stdout_lines }}" when: - test_case_2 == true
方案2:传递变量时强制转为数字
如果你坚持用数字比较,可以在传参时用Jinja2语法强制转成数字类型:
ansible-playbook playbook.yml -e stage={{1}}
这种方式会让stage成为数字类型,原有的比较逻辑就能正常工作,但缺点是其他人执行时容易忽略这个细节,再次踩坑。
验证效果
修改后执行原命令:
ansible-playbook playbook.yml -e stage=1
所有任务都会正常执行,不会再被跳过。
内容的提问来源于stack exchange,提问作者Sarva
相关产品推荐
相关产品推荐

