Come procederesti a elencare le istanze usando aws cli in alcuni VPC con il nome del tag, l'indirizzo IP privato dell'istanza e l'id dell'istanza?


19

Il più vicino che ottengo sta usando i seguenti comandi.

Questo comando riesce a elencare tutti i nomi delle istanze.

aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-e2f17e8b --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value[]'

Questo comando riesce a elencare tutti gli indirizzi IP privati, ID istanza e TUTTI i tag di cui non ho bisogno. Ho solo bisogno del nome.

aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-e2f17e8b | jq '.Reservations[].Instances[] | {PrivateIpAddress, InstanceId, Tags}'

Non sono sicuro del motivo per cui non posso eseguire il comando in questo modo:

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags[?Key==`Name`].Value[]'

Questo comando funziona ma mostra tutti i nomi delle chiavi dei tag.

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags'

1
Stai solo copiando questi comandi da qualche parte senza cercare di capire cosa fanno?
— Michael Hampton

Non proprio, ho provato a capire come usare jq e come ottenere l'output json di base che desidero. Tuttavia, non sono riuscito a trovare esempi per quello che sto cercando di ottenere. L'uso di "Tag [? Key == Name] .Value []" come filtro per l'output del valore del nome chiave è possibile solo dopo aws-cli v1.3.0. E sto usando una combinazione di --filter e jq per ottenere l'output che desidero. Il comando più vicino è aws ec2 descrizioni-istanze --filters Nome = vpc-id, Valori = vpc-e2f17e8b | jq '.Reservations []. Instances [] | {PrivateIpAddress, InstanceId, Tags} 'Devo solo sapere come fare riferimento a Tag Key = Name usando jq.
— Imagineer

Risposte:


24

È necessario sfuggire alle barre rovesciate per formattare correttamente la risposta.

aws ec2 describe-instances --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'

Quindi questo è il vero comando che vuoi:

$ aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-ac973bc9 --query 'Reservations[].Instances[].[PrivateIpAddress,InstanceId,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'
10.101.255.10   i-91efd39b Server1
10.101.255.9    i-f1e8d4fb Server2

E non hai bisogno .Value[]. Puoi semplicemente usare .Valuee questo darà lo stesso output.

Questo è fantastico, a proposito. Lo implementerò da solo!

CORREZIONE: quanto sopra non funzionerà se il valore di .Valueè "Nessuno". Funziona meglio:

$ aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-ac973bc9 --query 'Reservations[].Instances[].[PrivateIpAddress,InstanceId,Tags[?Key==`Name`].Value[]]' --output text | sed 's/None$/None\n/' | sed '$!N;s/\n/ /'
10.101.255.10   i-91efd39b Server1
10.101.255.9    i-f1e8d4fb Server2
10.101.255.8    i-f6c2450a      None
10.101.255.7    i-34a6afce Server3

Puoi per favore spiegare il tuo comando sed? Sto cancellando ID / nomi di istanza da uno che potrebbe essere perché non capisco l'espansione indiretta della shell in sed.
— Jorfus,

3
Se un'istanza non ha un nome (non ha Tag: key = Name set), l'istanza successiva viene stampata sulla stessa riga. Il primo comando sed stampa la stringa "None \ n" per mitigare quel problema. Il secondo comando sed rimuove l'alimentazione di riga dall'ID istanza, in modo che la stringa Tag: key = Name venga stampata sulla stessa riga.
— DrStrangepork,

8

Prova questo

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Name`].Value|[0],State.Name,PrivateIpAddress,PublicIpAddress]' --output text | column -t

3
Dovresti includere una spiegazione per il tuo codice. Descrivere come e perché questo codice risolve il problema è più utile in quanto aiuta l'OP e altri lettori a risolvere da soli questo e simili problemi.
— Anthony G - giustizia per Monica,

Funziona, ma in effetti, perché funziona? |è una specie di filtro?
— aairey,

7

Le risposte sopra sono OK, ma il mio preferito è lo stesso;

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType,PrivateIpAddress,PublicIpAddress,Tags[?Key==`Name`].Value[]]' --output json | tr -d '\n[] "' | perl -pe 's/i-/\ni-/g' | tr ',' '\t' | sed -e 's/null/None/g' | grep '^i-' | column -t

infatti, è possibile inserirlo in un elenco di elenchi di funzioni BASH;

awsls () { aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType,PrivateIpAddress,PublicIpAddress,Tags[?Key==`Name`].Value[]]' --output json | tr -d '\n[] "' | perl -pe 's/i-/\ni-/g' | tr ',' '\t' | sed -e 's/null/None/g' | grep '^i-' | column -t }

quindi chiama semplicemente dal prompt come 'awsls'


Come si aggiungono più funzioni in un file e si chiama semplicemente la funzione desiderata?
— Stryker,

2

Qualcosa come questo?

aws ec2 describe-instances --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'

1

Ho aggiunto un filtro per esempio stato "in esecuzione". Pubblicarlo qui nel caso fosse utile a chiunque.

Il mio caso d'uso è leggermente diverso, sto generando file host Ansible quindi voglio solo il nome IP privato su tutti gli host in esecuzione.

aws ec2 describe-instances --profile=$PROFILE --filters Name=vpc-id,Values=$VPCID Name=instance-state-name,Values=running --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed 's/None$/None\n/' | sed '$!N;s/\n/ /' | awk '{print $1 " #" $2 }'

0

Aggiungendo questo per le persone che troveranno questo post durante la ricerca di come ottenere le informazioni sull'istanza. È possibile aggiungere VPC nell'istruzione select per ricevere anche quello.

In PowerShell puoi usare:

(Get-EC2Instance -ProfileName Profile).Instances | select InstanceId,PrivateIPAddress,PublicIpAddress @{Name="Servername";Expression={$_.tags | where key -eq "Name" | select Value -expand Value}} | Format-Table.

Con l'interfaccia della riga di comando di AWS puoi utilizzare:

aws ec2 describe-instances --region=us-east-1 --query 'Reservations[].Instances[].[InstanceId,Tags[?Key==Name].Value|[0],PrivateIpAddress,PublicIpAddress]' --output text --profile ProfileName

Ho modificato la tua risposta per formattare i comandi come comandi / codice. Ti preghiamo di ricontrollare che il periodo alla fine del tuo primo comando debba essere lì? In caso contrario, ti preghiamo di modificarlo, grazie
— JimLohse
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.