如何在ansible中使用debug从var中获取唯一值

如何在ansible中使用debug从var中获取唯一值,ansible,ansible-2.x,Ansible,Ansible 2.x,我当前正在使用调试变量stmt获取设备计数。我试图只获取值,但输出确实随变量而来 - name: get number of device on each rack blades #set_fact: #devices_count: "{{ result.ansible_facts.blades.{{item}}.device|length }}" debug: var=result.ansible_facts.blades.{{item}}.devic

我当前正在使用调试变量stmt获取设备计数。我试图只获取值,但输出确实随变量而来

- name: get number of device on each rack blades
      #set_fact:
        #devices_count: "{{ result.ansible_facts.blades.{{item}}.device|length }}"

      debug: var=result.ansible_facts.blades.{{item}}.device|length
      register: devices_count
      with_sequence:
        - start=0 end="{{ blades_count|int - 1 }}"
当前从上述代码获取的输出:


    TASK [get number of device on each rack blades] *************************************************************************************************
    ok: [localhost] => (item=0) => {
        "item": "0",
        "result.ansible_facts.blades.0.device|length": "10"
    }
    ok: [localhost] => (item=1) => {
        "item": "1",
        "result.ansible_facts.blades.1.device|length": "8"
    }
    ok: [localhost] => (item=2) => {
        "item": "2",
        "result.ansible_facts.blades.2.device|length": "4"
    }

我怎样才能得到唯一的价值部分,即10,8,4

有没有一种方法可以过滤或获取。值部分或使用一些正则表达式


请提供任何帮助。

var
选项需要一个变量名字符串

您在该选项中输入了一个jinja2表达式(我甚至很惊讶您会得到一个结果),该表达式应该通过jinja2表达式标记(双花括号)传递给
msg
选项。需要修改
扩展才能工作

此外,注册调试任务的结果没有任何意义(在下一个任务中调试已注册的var,以便自己查看)

最后,我强烈建议您对所有任务采用现代的完整yaml语法,而不是对模块使用/混合使用
key=value
旧的快捷语法

以下内容将使您获得预期的结果

- name: debug my values
  debug:
    msg: "{{ result.ansible_facts.blades[item].device | length }}"
  with_sequence: start=0 end="{{ blades_count | int - 1 }}"
你甚至可以采用新的和它的

编辑:根据您的评论,我不确定您希望存储和循环什么。下面的示例是将原始值存储在一个简单的列表中(未提供样本数据时未进行测试)。如果这不是您所期望的,请针对此特定问题提出新问题,并提供有关实际数据结构和预期结果的更多详细信息

- name: Create a list with device number length
  vars:
    current_number: "{{ result.ansible_facts.blades[item].device | length }}"
  set_fact:
    device_numbers: "{{ device_numbers | default([]) + [current_number] }}"
  loop: "{{ range(0, blades_count | int) | list }}"

- name: Show device_numbers list
  debug:
    var: device_numbers
问:“…获取设备计数…我如何才能仅获取值部分,即10、8、4?”

答:下面给出了测试每个刀片服务器中设备数量的字典(3、4、5)

任务

- set_fact:
    devices: "{{ blades|dict2items|
                 json_query('[].value')|
                 map('length')|
                 list }}"
- debug:
    var: devices
给予


细节

将字典转换为列表

[
    {
        "key": 1, 
        "value": [
            "devA", 
            "devB", 
            "devC"
        ]
    }, 
    {
        "key": 2, 
        "value": [
            "devA", 
            "devB", 
            "devC", 
            "devD"
        ]
    }, 
    {
        "key": 3, 
        "value": [
            "devA", 
            "devB", 
            "devC", 
            "devD", 
            "devE"
        ]
    }
]
选择值列表

[
    [
        "devA", 
        "devB", 
        "devC"
    ], 
    [
        "devA", 
        "devB", 
        "devC", 
        "devD"
    ], 
    [
        "devA", 
        "devB", 
        "devC", 
        "devD", 
        "devE"
    ]
]
并将筛选器长度应用于列表的每个元素

[
    3, 
    4, 
    5
]

谢谢Zeitor。我如何存储这个“msg”值,因为我需要在嵌套的loop.Edited中使用它(尽管问题不应该包含几个问题)。如前所述,如果这不是您所期望的,请询问一个新的详细信息。谢谢Zeitounator。创建一个列表是有效的(至少是我想要得到/尝试的),但现在嵌套循环没有按预期工作。正如你所建议的,我已经创建了一个新的问题,包含了全部细节。如果你能看一看,那将是很大的帮助。再次感谢
[
    {
        "key": 1, 
        "value": [
            "devA", 
            "devB", 
            "devC"
        ]
    }, 
    {
        "key": 2, 
        "value": [
            "devA", 
            "devB", 
            "devC", 
            "devD"
        ]
    }, 
    {
        "key": 3, 
        "value": [
            "devA", 
            "devB", 
            "devC", 
            "devD", 
            "devE"
        ]
    }
]
[
    [
        "devA", 
        "devB", 
        "devC"
    ], 
    [
        "devA", 
        "devB", 
        "devC", 
        "devD"
    ], 
    [
        "devA", 
        "devB", 
        "devC", 
        "devD", 
        "devE"
    ]
]
[
    3, 
    4, 
    5
]