GCP - как сменить IP на ВМ с 2-мя сетевыми картами? - PullRequest
1 голос
/ 26 февраля 2020

У меня есть виртуальная машина с 2 сетевыми картами. По сути, это VPN-сервер, который принимает запросы на соединение на одном интерфейсе, а затем перенаправляет трафик c на другой интерфейс.

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

Мне удалось автоматизировать все шаги, кроме обновления access-config. Это связано с тем, что оба интерфейса имеют одно и то же имя конфигурации доступа («Внешний NAT»). Мне не удалось найти способ переименовать или воссоздать это имя конфигурации доступа, и я не нашел никакого обходного пути.

Любой вклад будет принята с благодарностью.

- accessConfigs:
  - kind: compute#accessConfig
    name: External NAT
    natIP: ##.##.##.##
    networkTier: STANDARD
    type: ONE_TO_ONE_NAT
  fingerprint: ==========
  kind: compute#networkInterface
  name: nic0
  network: https://www.googleapis.com/compute/v1/projects/#######/global/networks/inbound
  networkIP: 10.#.#.#
  subnetwork: https://www.googleapis.com/compute/v1/projects/#######/regions/northamerica-northeast1/subnetworks/inbound
- accessConfigs:
  - kind: compute#accessConfig
    name: External NAT
    natIP: ##.##.##.##
    networkTier: STANDARD
    type: ONE_TO_ONE_NAT
  fingerprint: =========
  kind: compute#networkInterface
  name: nic1
  network: https://www.googleapis.com/compute/v1/projects/#######/global/networks/outbound
  networkIP: 10.0.2.3
  subnetwork: https://www.googleapis.com/compute/v1/projects/#######/regions/northamerica-northeast1/subnetworks/outbound

1 Ответ

0 голосов
/ 26 февраля 2020

Я верю (!?) [На самом деле я не уверен ], что вы должны удалить, а затем создать; Вы не можете обновить существующую конфигурацию доступа, чтобы изменить IP-адрес, используя gcloud.

Кто-то еще, пожалуйста, подтвердите!

ПОЖАЛУЙСТА Попробуйте это на жертвенном экземпляре до вы используете его в производственном экземпляре

Таким образом:

PROJECT=[[YOUR-PROJECT]]
ZONE=[[YOUR-ZONE]]
INSTANCE=[[YOUR-INSTANCE]]
INTERFACE=[[YOUR-INTERFACE]] # Perhaps "nic1"

# Show what we have currently
gcloud compute instances describe ${INSTANCE} \
--zone=${ZONE} --project=${PROJECT} \
--format="yaml(networkInterfaces)"

# Delete the "External NAT" for ${INTERFACE}
gcloud compute instances delete-access-config instance-1 \
--zone=${ZONE} --project=${PROJECT} \
--network-interface=${INTERFACE} \
--access-config-name="External NAT"

# Show what we have currently **without** "External NAT" for ${INTERFACE}
gcloud compute instances describe ${INSTANCE} \
--zone=${ZONE} --project=${PROJECT} \
--format="yaml(networkInterfaces)"

# Create a new "External NAT" for ${INTERFACE}
# Include --address=ADDRESS if you have one
gcloud compute instances add-access-config ${INSTANCE} \
--zone=${ZONE} --project=${PROJECT} \
--network-interface=${INTERFACE} \
--access-config-name="External NAT"

# Show what we have currently with a **new** "External NAT" for ${INTERFACE}
gcloud compute instances describe ${INSTANCE} \
--zone=${ZONE} --project=${PROJECT} \
--format="yaml(networkInterfaces)"

Обновление

Это меня беспокоило.

Вы можете отфильтровать в командах описания значением ${INTERACE}:

gcloud compute instances describe ${INSTANCE} \
--zone=${ZONE} --project=${PROJECT} \
--format="yaml(networkInterfaces[].filter(name:${INTERFACE})"

Поскольку gcloud имеет собственную фильтрацию | форматирование, часто лучше отформатировать как JSON, а затем использовать jq. Используя jq, мы можем фильтровать по ${INTERFACE} и возвращать только конфигурацию доступа «Внешний NAT»:

gcloud compute instances describe ${INSTANCE} \
--zone=${ZONE} --project=${PROJECT} \
--format="json" \
jq -r ".networkInterfaces[]|select(.name==\"${INTERFACE}\")|.accessConfigs[]|select(.name==\"External NAT\")"
...