2015-01-16 3 views
5

У меня есть множество экземпляров, запущенных в GCE. Я хочу программно получить список внутренних IP-адресов из них, не войдя в экземпляры (локально).Как получить список внутренних IP-адресов экземпляров GCE

Я знаю, что могу работать:

gcloud compute instances list 

Но есть ли какие флаги я могу пройти, чтобы просто получить информацию, которую я хочу? , например.

gcloud compute instances list --internal-ips 

или аналогичный? Или мне придется пылесосить мой мозг sed/awk и разобрать результат?

Я также знаю, что я могу получить вывод в JSON, используя --format = json, но я пытаюсь сделать это в сценарии bash.

+0

или AWK, вероятно, лучше – Spanky

+0

небольшой набор, например, выход из 'gcloud' и ваш необходимый результат будет сделать намного проще non-'gcloud', чтобы помочь с вашей проблемой. Удачи. – shellter

ответ

0

Насколько я знаю, вы не можете фильтровать определенные поля в инструменте gcloud. Что-то, как это будет работать на Баш скрипт, но он все еще чувствует себя немного хрупкий:

gcloud compute instances list --format=yaml | grep " networkIP:" | cut -c 14-100 
0

Я согласен с @Christiaan. В настоящее время нет автоматизированного способа получения внутренних IP-адресов с помощью команды gcloud.

Вы можете использовать следующую команду для печати внутренних IP-адресов (четвёртая колонка):

gcloud compute instances list | tail -n+2 | awk '{print $4}' 

или следующие один, если вы хотите иметь пару <instance_name> <internal_ip> (1-й и 4-й столбец)

gcloud compute instances list | tail -n+2 | awk '{print $1, $4}' 

Надеюсь, это поможет.

+0

Обратите внимание, что это не работает, если у вас есть сеть с превентивными экземплярами (в этом случае четвертый столбец является ли он превентивным). – speedplane

6

Несколько вещей здесь.

Первый формат вывода gcloud по умолчанию для листинга не гарантирует стабильности, а новые столбцы могут быть добавлены в будущем. Не делайте сценарий против этого!

Три режима вывода - три режима вывода, которые доступны с флагом формата, --format = json, --format = yaml и format = text, основаны на парах key = value и могут быть написаны сценарием против даже если новые поля будут представлены в будущем.

Два хороших способов сделать то, что вы хотите это использовать JSON и инструмент JQ,

gcloud compute instances list --format=json \ 
    | jq '.[].networkInterfaces[].networkIP' 

или текстовый формат и Grep + строка-ориентированных с помощью инструментов,

gcloud compute instances list --format=text \ 
    | grep '^networkInterfaces\[[0-9]\+\]\.networkIP:' | sed 's/^.* //g' 
+1

Думаю, вам нужно. в команде jq, например, список экземпляров gcloud compute --format = json | jq '. []. networkInterfaces []. networkIP' – dranxo

+1

Мой ответ здесь немного устарел. Новые выпуски gcloud обеспечивают гораздо больший контроль над форматированием вывода, фильтрацией полей и т. Д. См. Https://cloud.google.com/sdk/gcloud/reference/topic/formats для обзора. –

+0

это очень помогло. export PROXY = $ (список экземпляров gcloud compute --format = text | grep '^ networkInterfaces \ [[0-9] \ + \] \. NetworkIP:' | sed's /^.* // g ') сохранит его для переменной env для вас – Ozzadar

10

Самый простой способ для программного получения списка внутренних IP-адресов (или внешних IP-адресов) без зависимости от каких-либо инструментов, отличных от gcloud, является:

$ gcloud --format="value(networkInterfaces[0].networkIP)" compute instances list 
$ gcloud --format="value(networkInterfaces[0].accessConfigs[0].natIP)" compute instances list 

Используется --format=value, который также требует projection, который представляет собой список resource keys, который выбирает значения данных ресурса.Для любой команды можно использовать --format=flattened, чтобы получить список ресурсов пар ключ/значение:

$ gcloud --format=flattened compute instances list 
+0

Вы знаете, как сделать ее запятой разделенной атрибутами значения? Это не работает: 'gcloud --format =" value [terminator = ","] (networkInterfaces [0] .accessConfigs [0] .natIP) "list list экземпляров" –

+2

@ AlexCalm1Kov у вас есть двойные кавычки, вложенные в двойные кавычки, которые ломаются, поэтому замените одну из пар так: 'gcloud --format =" значение [terminator = ','] (networkInterfaces [0] .accessConfigs [0] .natIP) "вычислить список экземпляров" или вы также можете попробовать использовать 'paste' так:' gcloud --format = "value (networkInterfaces [0] .accessConfigs [0] .natIP)" список экземпляров экземпляров | paste -d, -s -', который не оставляет ложной конечной запятой, когда есть только одно значение. Я рассмотрел бы этот случай ошибку в предыдущей команде. – aculich