【问题标题】:Retrieve specific facts from the Ansible Setup module using JQ使用 JQ 从 Ansible 设置模块中检索特定事实
【发布时间】:2021-12-31 14:46:19
【问题描述】:

我正在尝试从 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 添加到您的问题中?
  • 您想要的输出不是有效的 json。你不能有 2 个MOunts 键。数组会更符合逻辑。

标签: installation ansible jq


【解决方案1】:

没有看到相关 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]
  }

【讨论】:

  • 谢谢,这正是我想要的。
猜你喜欢
  • 2018-01-16
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
相关资源
最近更新 更多