【问题标题】:Comparing dictionaries in Ansible比较 Ansible 中的字典
【发布时间】:2021-01-15 17:39:12
【问题描述】:

我试图有一个任务来断言两个定义为事实的字典。

以下是两个字典,其中的键具有每个管理程序可用或所需的磁盘空间。

"available": {
    "hypervisor-01": 2321,
    "hypervisor-02": 46
}
"required": {
    "hypervisor-01": "200",
    "hypervisor-02": "75"
}

前面的事实断言应该失败,因为 hypervisor-02 需要的比可用的要多。

"available": {
    "hypervisor-01": 2321,
    "hypervisor-02": 46
}
"required": {
    "hypervisor-01": "200",
    "hypervisor-02": "5"
}

前面的字典应该通过,因为所有的要求都得到了满足。如果至少有一个条件不满足,它应该会失败(可能有很多管理程序)。

【问题讨论】:

    标签: ansible jinja2


    【解决方案1】:

    试试这个

        - set_fact:
            ka: "{{ available.keys()|list }}"
            kr: "{{ required.keys()|list }}"
    
        - assert:
            that: kr|difference(ka)|length == 0
            fail_msg: Required hypervisor not available.
    
        - assert:
            that: sum_max == sum_avail
            fail_msg: Required space not available.
          vars:
            va: "{{ kr|map('extract', available)|list }}"
            vr: "{{ kr|map('extract', required)|list }}"
            sum_max: "{{ vr|zip(va)|map('max')|sum }}"
            sum_avail: "{{ va|sum }}"
    

    【讨论】:

      【解决方案2】:

      请参阅下面的剧本。我添加了另外 2 个可能不适用于您的情况的条件(以防 availablerequired 没有相同的键)

      剧本

      ---
      - hosts: localhost
        gather_facts: false
        vars:
          available:
            hypervisor-01: 2321
            hypervisor-02: 46
            hypervisor-03: 462
          required:
            hypervisor-01: 200
            hypervisor-02: 75
      
        tasks:
        - assert:
            that:
            - required[item] is defined
            - available[item] > required[item]
          with_items: "{{ available.keys() | list }}"
      

      输出:

      TASK [assert] **********************************************************************************************************************************************************************************************************
      ok: [localhost] => (item=hypervisor-01) => {
          "ansible_loop_var": "item",
          "changed": false,
          "item": "hypervisor-01",
          "msg": "All assertions passed"
      }
      failed: [localhost] (item=hypervisor-02) => {
          "ansible_loop_var": "item",
          "assertion": "available[item] > required[item]",
          "changed": false,
          "evaluated_to": false,
          "item": "hypervisor-02",
          "msg": "Assertion failed"
      }
      failed: [localhost] (item=hypervisor-03) => {
          "ansible_loop_var": "item",
          "assertion": "required[item] is defined",
          "changed": false,
          "evaluated_to": false,
          "item": "hypervisor-03",
          "msg": "Assertion failed"
      }
      
      PLAY RECAP *************************************************************************************************************************************************************************************************************
      localhost                  : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-03
        • 1970-01-01
        • 1970-01-01
        • 2019-06-15
        • 2015-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多