Tenho a seguinte saída JSON da AWS CLI que contém o ID da instância, o endereço IP e alguns outros valores das minhas tags da AWS (uma lista de FQDNs desejados e se um proxy deve ser usado ou não):
[
[
{
"InstanceId": "i-11111111111111111",
"ClusterName": "vpn",
"Ip": "192.168.0.1",
"FqdnList": "vpn.example.com",
"Proxy": null
}
],
[
{
"InstanceId": "i-22222222222222222",
"ClusterName": "sql",
"Ip": "192.168.0.2",
"FqdnList": "db.example.com;sql.example.com",
"Proxy": "nginx"
}
],
[
{
"InstanceId": "i-33333333333333333",
"ClusterName": "nginx",
"Ip": "192.168.0.3",
"FqdnList": "nginx.example.com;db.example.com;sql.example.com",
"Proxy": null
}
],
[
{
"InstanceId": "i-44444444444444444",
"ClusterName": "vpn",
"Ip": "192.168.0.4",
"FqdnList": "vpn.example.com",
"Proxy": null
}
],
[
{
"InstanceId": "i-55555555555555555",
"ClusterName": "nginx",
"Ip": "192.168.0.5",
"FqdnList": "nginx.example.com;db.example.com;sql.example.com",
"Proxy": null
}
]
]
Meu objetivo final é usar esse JSON para criar a lista de A
registros DNS (para outro script que preenche nossa zona DNS), então estou tentando transpô-lo para algo mais simples, como:
{
"vpn.example.com": [
"192.168.0.1",
"192.168.0.4",
],
"nginx.example.com": [
"192.168.0.3"
"192.168.0.5"
],
"db.example.com": [
"192.168.0.3"
"192.168.0.5"
],
"sql.example.com": [
"192.168.0.3"
"192.168.0.5"
]
}
ou
[
{
"name": "vpn.example.com",
"value": "192.168.0.1"
},
{
"name": "vpn.example.com",
"value": "192.168.0.4"
},
{
"name": "nginx.example.com",
"value": "192.168.0.3"
},
{
"name": "nginx.example.com",
"value": "192.168.0.5"
},
{
"name": "db.example.com",
"value": "192.168.0.5"
},
{
"name": "db.example.com",
"value": "192.168.0.3"
},
{
"name": "sql.example.com",
"value": "192.168.0.3"
},
{
"name": "sql.example.com",
"value": "192.168.0.5"
}
]
Consegui remover os itens que estão sendo um proxy ( Proxy
!= null
, porque seus endereços já estão repetidos na tag do proxy) e criar um array a partir da string FQDNs usando:
jq '
.[].[]
| select(.Proxy | . == null)
| {
Ip: .Ip,
Fqdns: .FqdnList | split(";"),
}
'
O que dá:
{
"Ip": "192.168.0.1",
"Fqdns": [
"vpn.example.com"
]
}
{
"Ip": "192.168.0.3",
"Fqdns": [
"nginx.example.com",
"db.example.com",
"sql.example.com"
]
}
{
"Ip": "192.168.0.4",
"Fqdns": [
"vpn.example.com"
]
}
{
"Ip": "192.168.0.5",
"Fqdns": [
"nginx.example.com",
"db.example.com",
"sql.example.com"
]
}
Mas como eu "crio" linhas/itens para cada item em Fqdns
matrizes?
Não tenho certeza se isso é possível em jq
.
Isso pode ser feito facilmente em um script PHP/Python, mas prefiro mantê-lo "simples".
Pode map()
+ group_by()
ser útil como nesta resposta do SO? "Transpondo" objetos em jq