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.