Как получить список внутренних 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