关于Ansible中null与{{ None }}判断结果差异的技术咨询
为啥Ansible里
null和"{{ None }}"判断==None结果不一样? 问题的核心在于这两个变量的实际值类型完全不同:
a: null:这是YAML自带的空值写法,Ansible解析时会直接转成Python的None对象。所以when: a==None其实是在比较两个None,结果自然为真。b: "{{ None }}":这是用Jinja2模板渲染出来的值。Jinja2有个默认规则:渲染Python的None时,会把它转成空字符串(""),不会保留None对象。所以b实际是空字符串,不是None,那b==None肯定不成立,b!=None就为真了。
加个测试直观看类型差异
你可以在剧本里加这两个任务,一眼就能看出区别:
- name: 查看a的类型和是否为None debug: msg: "a是None吗?{{ a is none }}, a的类型:{{ type(a) }}" - name: 查看b的类型和是否为None debug: msg: "b是None吗?{{ b is none }}, b的类型:{{ type(b) }}"
执行后会输出类似这样的结果:
ok: [localhost] => { "msg": "a是None吗?True, a的类型:<class 'NoneType'>" } ok: [localhost] => { "msg": "b是None吗?False, b的类型:<class 'str'>" }
正确设置None值的方法
如果要在变量里存Python的None,推荐用:
- YAML原生的
null写法,也就是变量名: null - 如果必须通过模板生成,得用Jinja2的
none过滤器强制转换:变量名: "{{ 目标值 | none }}"(当“目标值”为空时会转成None)
内容的提问来源于stack exchange,提问作者Marko
相关产品推荐
相关产品推荐

