【问题标题】:ansible condition validation not skip the rest condition when first failedansible 条件验证在第一次失败时不会跳过其余条件
【发布时间】:2016-01-18 17:01:46
【问题描述】:

如果 vlan 变量没有在 ansible 中定义,但是,ansible 在以下情况下仍然会失败。换句话说,如果第一个条件失败,则应忽略其余条件(短路)。如何在 Ansible 中解决此问题?

- name: Validate vlan ID
  when: vlan is defined and ({{ vlan }} < 1 or {{ vlan }} > 4094)
  fail: msg='VLAN {{vlan}} is not in the range of [1, 4094]'

File "/usr/lib/python2.7/dist-packages/jinja2/runtime.py", line 485, in _fail_with_undefined_error
raise self._undefined_exception(hint)
UndefinedError: 'vlan' is undefined

【问题讨论】:

    标签: python jinja2 ansible


    【解决方案1】:

    您遇到的问题来自尝试使用{{ }} 访问vlan 的内容。如果您将任务更新为以下语法,则会跳过该任务。

    - name: Validate vlan ID
      when: vlan is defined and (vlan < 1 or vlan > 4094)
      fail: msg='VLAN {{vlan}} is not in the range of [1, 4094]'
    

    【讨论】:

    • 根据您的建议,我得到以下问题: msg: VLAN 2333 is not in the range of [1, 4094]
    • 这是vlan没有定义的时候?我运行了一个示例,当 vlan 未定义时,任务被跳过
    • 当我将 vlan 定义为 2333 时会发生这种情况。可能与字符串或数字有关?
    • 可以分享一下你设置vlan的yml吗?我能够重现您的错误的唯一方法是将 vlan 设置为字符串“2333”而不是设置为数字 2333。在这种情况下,您需要将 vlan 设置为数字或在评估时解析 vlan .
    • 我通过带有 -e vlan=2333 的剧本运行。从上面的消息可以看出,vlan id 不是字符串
    【解决方案2】:

    令人惊讶的是,我必须使用以下格式和“-e vlan=2333”来传递以下条件:
    何时:定义了 vlan 并且 (vlan|int 4094)

    感谢 Andrew 的精彩提示!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多