如何在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
]
我目前正在使用调试变量 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
]