Как получить список внутренних IP-адресов экземпляров GCE

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

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

gcloud compute instances list

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

gcloud compute instances list --internal-ips

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

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

5 ответов

Самый простой способ программно получить список внутренних 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 для которого также требуется проекция, представляющая собой список ключей ресурса, которые выбирают значения данных ресурса. Для любой команды вы можете использовать --format=flattened чтобы получить список пар ключ / значение ресурса:

$ gcloud --format=flattened compute instances list

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

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

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

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

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

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

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

Я охотился и не мог найти прямой ответ, вероятно, потому что эффективные инструменты не были доступны, когда другие ответили на первоначальный вопрос. GCP постоянно обновляет их библиотеки и API, и мы можем использовать фильтр и прогнозы для извлечения целевых атрибутов.

Здесь я опишу, как зарезервировать внешний статический IP-адрес, посмотреть, как его атрибуты названы и организованы, а затем экспортировать внешний IP-адрес, чтобы я мог использовать его в других сценариях (например, назначить его экземпляру виртуальной машины или авторизовать эту сеть (IP-адрес). адрес) на экземпляре Cloud SQL.

Зарезервируйте статический IP в выбранном вами регионе

gcloud compute --project=[PROJECT] addresses create [NAME] --region=[REGION]

[Информационный] Просмотр сведений о региональном статическом IP, который был зарезервирован

gcloud compute addresses describe [NAME] --region [REGION] --format=flattened

[Информационный] Список атрибутов статического IP в виде пар ключ-значение

gcloud compute addresses describe [NAME] --region [REGION] --format='value(address)'

Извлеките желаемое значение (например, внешний IP-адрес) в качестве параметра

export STATIC_IP=$(gcloud compute addresses describe [NAME] --region [REGION] --format='value(address)’)

Используйте экспортированный параметр в других скриптах

echo $STATIC_IP

Лучше всего иметь готовые gcloud команда используйте то же самое, что и при необходимости.

Этого можно добиться с помощью table() вариант формата с gcloud как показано ниже:

gcloud compute instances list --format='table(id,name,status,zone,networkInterfaces[0].networkIP :label=Internal_IP,networkInterfaces[0].accessConfigs[0].natIP :label=External_IP)'

Что это для тебя значит?

  • Получите данные в чистом формате
  • Дайте вам возможность добавлять или удалять столбцы

Нужны дополнительные столбцы? Как найти имя столбца еще до того, как вы запустите указанную выше команду?

Выполните следующее, которое предоставит вам данные в необработанном формате JSON, состоящем из значения и его имени, скопируйте эти имена и добавьте их в свой список table().:-)

gcloud compute instances list --format=json

Плюс: это почти тот же синтаксис, который вы можете настроить с любыми данными ресурсов GCP для извлечения, в том числе с помощьюgcloud, kubectl и т.п.

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

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

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}'  

Я надеюсь, что это помогает.

Насколько я знаю, вы не можете фильтровать определенные поля в инструменте gcloud. Нечто подобное будет работать для скрипта Bash, но оно все еще выглядит немного ломким:

gcloud compute instances list --format=yaml | grep "  networkIP:" | cut -c 14-100
Другие вопросы по тегам