Encontrei o seguinte nas páginas do github govc govmomi , que me permite pesquisar VMs por endereço MAC:
govc object.collect -json -type m / config.hardware.device \
| jq -r '
.
| select(.ChangeSet[].Val.VirtualDevice[].MacAddress == "00:50:56:bc:5e:3c")
| [.Obj.Type, .Obj.Value]
| join(":")
' \
| xargs govc ls -L
Em anexo, segue um trecho da saída do govc que deve ser suficiente:
{
"Obj": {
"Type": "VirtualMachine",
"Value": "vm-666"
},
"ChangeSet": [
{
"Val": {
"VirtualDevice": [
{
},
{
"MacAddress": "00:50:56:bc:5e:3c"
}
]
}
}
]
}
O problema que estou enfrentando é que alguns MACs contêm letras maiúsculas, algumas minúsculas, e não sei com antecedência qual máquina usa qual esquema. Não consigo descobrir como fazer com que o ==
caso não seja sensível.
Encontrei respostas aqui no stackoverflow que sugerem usar ascii_downcase
como filtro, mas não sei como aplicar isso com o ==
.
A sintaxe sugerida em https://stackoverflow.com/a/62454688 me dá uma sequência de explode input must be a string
erros (1 por linha de saída do govc).
Caso isso seja importante para este exercício: isso está acontecendo em Mac OS 15.1
, jq
é instalado via brew, a versão é 1.7.1
.
Supondo que normalizar MacAddress para ascii_downcase seria suficiente, uma abordagem seria adicionar um filtro de pré-processamento usando
walk
algo assim:Você pode querer uma abordagem mais direcionada, mas o acima ainda pode servir como um guia. (*)
Outra abordagem seria usar correspondência baseada em regexp com a opção "i" para "ignorar maiúsculas e minúsculas", ou seja, test(_,"i"). Essa seria a abordagem recomendada em casos em que
ascii_downcase
não for suficiente.(*) Se o seu jq for suficientemente antiquado, você terá que incluí-lo
else .
também.Isso ocorre porque um dos seus dispositivos não tem o
MacAddress
campo eascii_downcase
só suporta strings, nãonull
.Para corrigir isso, você pode usar
// ""
[ link doc ] para definir como padrão a string vazia e, em seguida , passá-la porascii_downcase
:Cada
…[]
um.ChangeSet[].Val.VirtualDevice[].MacAddress
cria um fluxo de potencialmente mais de um resultado. No exemplo dado,.ChangeSet[]
produz um item e (para cada um deles).Val.VirtualDevice
avalia para dois itens, criando um fluxo combinado de dois itens. Se você quiser reduzir esse fluxo para uma decisão binária (zero ou um item apenas), use uma função agregada que execute essa conversão. Por exemplo, se você quiserselect
retornar com um item se pelo menos um deles passar no teste, use aany
função .(Além disso, estou preferindo
strings
em vez de// ""
, então itens sem a.MacAddress
são filtrados imediatamente em vez de substituí-los por uma string vazia que só falha depois quando comparada a outra string literal.)Demonstração