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

How to get only value from var using debug in ansible

我目前正在使用调试变量 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"
    }

如何只获取值部分 IE, 10, 8, 4.

有没有办法过滤或获取 .value 部分或使用一些正则表达式?

请帮忙..

var debug module 选项需要一个字符串,它是变量的名称。

您在该选项中输入了一个 jinja2 表达式(我什至对您得到的结果感到惊讶)应该传递给带有 jinja2 表达式标记(双花括号)的 msg 选项。 item 扩展需要修改才能工作。

另外,注册调试任务的结果也没什么意思(在下一个任务中调试注册的var自己看看)。

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

以下应该会让您获得预期的结果

- name: debug my values
  debug:
    msg: "{{ result.ansible_facts.blades[item].device | length }}"
  with_sequence: start=0 end="{{ blades_count | int - 1 }}"

您甚至可以采用新的 loop syntax and its with_sequence replacement

- name: debug my values
  debug:
    msg: "{{ result.ansible_facts.blades[item].device | length }}"
  loop: "{{ range(0, blades_count | int) | list }}"

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

- 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

Q: " ... getting the device count ... how can I get only value part ie, 10, 8, 4?"

A:给定下面的字典来测试每个 blade (3, 4, 5)

中的设备数量
blades:
  1: [devA, devB, devC]
  2: [devA, devB, devC, devD]
  3: [devA, devB, devC, devD, devE]

任务

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

给予

"devices": [
    3, 
    4, 
    5
]

详情

dict2items 将字典转换为列表

[
    {
        "key": 1, 
        "value": [
            "devA", 
            "devB", 
            "devC"
        ]
    }, 
    {
        "key": 2, 
        "value": [
            "devA", 
            "devB", 
            "devC", 
            "devD"
        ]
    }, 
    {
        "key": 3, 
        "value": [
            "devA", 
            "devB", 
            "devC", 
            "devD", 
            "devE"
        ]
    }
]

json_query 选择值列表

[
    [
        "devA", 
        "devB", 
        "devC"
    ], 
    [
        "devA", 
        "devB", 
        "devC", 
        "devD"
    ], 
    [
        "devA", 
        "devB", 
        "devC", 
        "devD", 
        "devE"
    ]
]

map 将过滤器 length 应用于列表的每个元素

[
    3, 
    4, 
    5
]