如何在ansible中使用debug从var中获取唯一值
我当前正在使用调试变量stmt获取设备计数。我试图只获取值,但输出确实随变量而来如何在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
- 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
]