使用 JQ 从 Ansible 设置模块中检索特定事实
Retrieve specific facts from the Ansible Setup module using JQ
我正在尝试从 Ansible 的设置模块中提取数据。我可以做我需要做的大部分事情,但我坚持做一些可能很简单的事情。
我正在尝试生成一个主机列表,包括磁盘 + 大小和分区 + 大小和挂载点。
我可以像这样轻松获得前两个(这应该适用于本地主机上的任何服务器 运行)- 我需要 sed 来正确格式化 json:
$ ansible localhost -m setup | sed '1 s/^.*$/{/' | jq '.ansible_facts | {hostname: .ansible_hostname, Disks: .ansible_devices| with_entries(.value |= .size), Partitions: .ansible_devices[].partitions | with_entries(.value |= .size) }'
{
"hostname": "ip-172-31-16-55",
"Disks": {
"xvda": "10.00 GB"
},
"Partitions": {
"xvda1": "1.00 GB",
"xvda2": "9.00 GB"
}
}
现在如果我想收集挂载点,我可以这样做:
$ ansible localhost -m setup | sed '1 s/^.*$/{/' | jq -r '.ansible_facts.ansible_mounts[].mount'
/
/boot
但是因为安装信息是一个数组(我想?)我需要映射它才能让它工作?我想在与上面的列表相同的列表中获得结果,但是当我将它添加到其中时它起作用了,但它为每个挂载点提供了一个新列表,而不仅仅是一个列表!
这是我得到的:
$ ansible localhost -m setup | sed '1 s/^.*$/{/' | jq '.ansible_facts | {hostname: .ansible_hostname, Disks: .ansible_devices| with_entries(.value |= .size), Partitions: .ansible_devices[].partitions | with_entries(.value |= .size), Mounts: .ansible_mounts[].mount }'
{
"hostname": "ip-172-31-16-55",
"Disks": {
"xvda": "10.00 GB"
},
"Partitions": {
"xvda1": "1.00 GB",
"xvda2": "9.00 GB"
},
"Mounts": "/"
}
{
"hostname": "ip-172-31-16-55",
"Disks": {
"xvda": "10.00 GB"
},
"Partitions": {
"xvda1": "1.00 GB",
"xvda2": "9.00 GB"
},
"Mounts": "/boot"
}
但是,这就是我想要得到的:
{
"hostname": "ip-172-31-16-55",
"Disks": {
"xvda": "10.00 GB"
},
"Partitions": {
"xvda1": "1.00 GB",
"xvda2": "9.00 GB"
},
"Mounts": "/"
"Mounts": "/boot"
}
}
甚至 ,
分隔列表在一行?
},
"Mounts": "/", "/boot"
}
我想我现在看不到树木的木材,如果能稍微推动一下,我们将不胜感激。
谢谢
没有看到相关 JSON 的样本,检查起来有点困难,但希望以下内容能为您提供所需的帮助:
.ansible_facts
| {hostname: .ansible_hostname,
Disks: (.ansible_devices | with_entries(.value |= .size)),
Partitions: ([.ansible_devices[].partitions | with_entries(.value |= .size)]|add),
Mounts: [.ansible_mounts[].mount]
}
我正在尝试从 Ansible 的设置模块中提取数据。我可以做我需要做的大部分事情,但我坚持做一些可能很简单的事情。
我正在尝试生成一个主机列表,包括磁盘 + 大小和分区 + 大小和挂载点。
我可以像这样轻松获得前两个(这应该适用于本地主机上的任何服务器 运行)- 我需要 sed 来正确格式化 json:
$ ansible localhost -m setup | sed '1 s/^.*$/{/' | jq '.ansible_facts | {hostname: .ansible_hostname, Disks: .ansible_devices| with_entries(.value |= .size), Partitions: .ansible_devices[].partitions | with_entries(.value |= .size) }'
{
"hostname": "ip-172-31-16-55",
"Disks": {
"xvda": "10.00 GB"
},
"Partitions": {
"xvda1": "1.00 GB",
"xvda2": "9.00 GB"
}
}
现在如果我想收集挂载点,我可以这样做:
$ ansible localhost -m setup | sed '1 s/^.*$/{/' | jq -r '.ansible_facts.ansible_mounts[].mount'
/
/boot
但是因为安装信息是一个数组(我想?)我需要映射它才能让它工作?我想在与上面的列表相同的列表中获得结果,但是当我将它添加到其中时它起作用了,但它为每个挂载点提供了一个新列表,而不仅仅是一个列表!
这是我得到的:
$ ansible localhost -m setup | sed '1 s/^.*$/{/' | jq '.ansible_facts | {hostname: .ansible_hostname, Disks: .ansible_devices| with_entries(.value |= .size), Partitions: .ansible_devices[].partitions | with_entries(.value |= .size), Mounts: .ansible_mounts[].mount }'
{
"hostname": "ip-172-31-16-55",
"Disks": {
"xvda": "10.00 GB"
},
"Partitions": {
"xvda1": "1.00 GB",
"xvda2": "9.00 GB"
},
"Mounts": "/"
}
{
"hostname": "ip-172-31-16-55",
"Disks": {
"xvda": "10.00 GB"
},
"Partitions": {
"xvda1": "1.00 GB",
"xvda2": "9.00 GB"
},
"Mounts": "/boot"
}
但是,这就是我想要得到的:
{
"hostname": "ip-172-31-16-55",
"Disks": {
"xvda": "10.00 GB"
},
"Partitions": {
"xvda1": "1.00 GB",
"xvda2": "9.00 GB"
},
"Mounts": "/"
"Mounts": "/boot"
}
}
甚至 ,
分隔列表在一行?
},
"Mounts": "/", "/boot"
}
我想我现在看不到树木的木材,如果能稍微推动一下,我们将不胜感激。
谢谢
没有看到相关 JSON 的样本,检查起来有点困难,但希望以下内容能为您提供所需的帮助:
.ansible_facts
| {hostname: .ansible_hostname,
Disks: (.ansible_devices | with_entries(.value |= .size)),
Partitions: ([.ansible_devices[].partitions | with_entries(.value |= .size)]|add),
Mounts: [.ansible_mounts[].mount]
}