Jak postąpiłbyś w kwestii wyświetlania instancji za pomocą aws cli w niektórych VPC z nazwą tagu, prywatnym adresem IP instancji i identyfikatorem instancji?

19

Najbliższe, jakie mam, to użycie następujących poleceń.

To polecenie zarządza listą wszystkich nazw instancji.

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

To polecenie zarządza listą wszystkich prywatnych adresów IP, identyfikatora instancji i WSZYSTKICH tagów, których nie potrzebuję. Potrzebuję tylko imienia.

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

Nie jestem pewien, dlaczego nie mogę wykonać polecenia w ten sposób:

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

To polecenie działa, ale pokazuje wszystkie nazwy kluczy tagów.

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags'
Wyobraźnia
źródło
1
Czy po prostu kopiujesz te polecenia gdzieś, nie próbując zrozumieć, co oni robią?
Michael Hampton
Nie bardzo, próbowałem zrozumieć, jak korzystać z jq i jak uzyskać podstawowe wyjście json, które chcę. Nie znalazłem jednak żadnych przykładów tego, co próbuję osiągnąć. Używanie „Tagów [? Key == Name] .Value []” jako filtru dla danych wyjściowych Key Name Value jest możliwe tylko po aws-cli v1.3.0. I używam kombinacji --filter i jq, aby uzyskać pożądany wynik. Najbliższym poleceniem jest aws ec2 description-instances - filtry Nazwa = vpc-id, Wartości = vpc-e2f17e8b | jq '.Reservations []. Instances [] | {PrivateIpAddress, InstanceId, Tags} „Muszę tylko wiedzieć, jak odwoływać się do Tag Tag = Name za pomocą jq.
Imagineer

Odpowiedzi:

24

Musisz uciec z ukośników odwrotnych, aby poprawnie sformatować odpowiedź.

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

Oto właściwe polecenie:

$ 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

I nie potrzebujesz .Value[]. Możesz po prostu użyć .Value, a to da ten sam wynik.

To jest niesamowite, przy okazji. Będę to sam realizować!

KOREKCJA: Powyższe nie zadziała, jeśli wartość .Value„Brak”. Działa to lepiej:

$ 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
DrStrangepork
źródło
Czy możesz wyjaśnić swoje polecenie sed? Dostaję identyfikatory / nazwy instancji o jeden, co może być spowodowane tym, że nie rozumiem pośredniego rozszerzenia powłoki w sed.
jorfus
3
Jeśli instancja nie ma nazwy (nie ma tagu: klucz = nazwa ustawiona), następna instancja zostanie wydrukowana w tym samym wierszu. Pierwsze polecenie sed wypisuje ciąg „Brak \ n”, aby złagodzić ten problem. Drugie polecenie sed usuwa kanał z identyfikatora instancji, dzięki czemu ciąg Tag: klucz = Nazwa jest drukowany w tym samym wierszu.
DrStrangepork
8

Spróbuj tego

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Name`].Value|[0],State.Name,PrivateIpAddress,PublicIpAddress]' --output text | column -t
alf-man
źródło
3
Powinieneś dołączyć wyjaśnienie swojego kodu. Opisanie, w jaki sposób i dlaczego ten kod rozwiązuje problem, jest bardziej przydatne, ponieważ pomaga OP i innym czytelnikom samodzielnie rozwiązać ten i podobne problemy.
Anthony G - sprawiedliwość dla Moniki
To działa, ale w rzeczywistości, dlaczego to działa? |jest jakiś filtr?
aairey
7

Powyższe odpowiedzi są OK, ale moim ulubionym z nich jest;

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

w rzeczywistości można go umieścić na liście listy funkcji 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 }

następnie po prostu zadzwoń z wiersza polecenia jako „awsls”

Jorge de la Torre
źródło
Jak dodać wiele funkcji do jednego pliku i wywołać żądaną funkcję?
Stryker,
2

Coś takiego?

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

Dodałem filtr, na przykład stan „działa”. Opublikowanie go tutaj, na wypadek, gdyby było to pomocne dla każdego.

Mój przypadek użycia jest nieco inny, generuję pliki hosta Ansible, więc chcę tylko prywatną nazwę IP # na wszystkich działających hostach.

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 }'
Jorfus
źródło
0

Dodanie tego dla osób, które znajdą ten post podczas wyszukiwania informacji o instancji. Możesz dodać VPC w instrukcji select, aby również to otrzymać.

W PowerShell możesz użyć:

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

Dzięki AWS CLI możesz używać:

aws ec2 describe-instances --region=us-east-1 --query 'Reservations[].Instances[].[InstanceId,Tags[?Key==Name].Value|[0],PrivateIpAddress,PublicIpAddress]' --output text --profile ProfileName
Jose Adams
źródło
Zredagowałem twoją odpowiedź, aby sformatować polecenia jako polecenia / kod. Czy mógłby Pan dokładnie sprawdzić, czy musi upłynąć okres pod koniec pierwszego polecenia? Jeśli nie, wyedytuj go, dzięki
JimLohse