Gcloud-无法使用一个服务帐户配置多个VM

时间:2018-11-06 21:54:23

标签: google-cloud-platform cloud gcloud google-iam

我正在使用Gcloud运行Prow(连续集成服务器)。我的工作之一是创建虚拟机,执行一些测试,然后删除该实例。我使用服务帐户创建VM,运行测试。

#!/bin/bash

set -o errexit

cleanup() {
    gcloud compute instances delete kyma-integration-test-${RANDOM_ID}
}


gcloud config set project ...
gcloud auth activate-service-account --key-file ...

gcloud compute instances create <vm_name> \
    --metadata enable-oslogin=TRUE \
    --image debian-9-stretch-v20181009 \
    --image-project debian-cloud --machine-type n1-standard-4 --boot-disk-size 20 \

trap cleanup exit

gcloud compute scp --strict-host-key-checking=no --quiet <script.sh> <vm_name>:~/<script.sh>

gcloud compute ssh --quiet <vm_name> -- ./<script.sh>

一段时间后,出现以下错误:

ERROR: (gcloud.compute.scp) INVALID_ARGUMENT: Login profile size exceeds 32 KiB. Delete profile values to make additional space.

实际上,对于该服务帐户,describe命令返回大量数据,例如sshPublicKeys部分中的〜70个条目。

gcloud auth activate-service-account --key-file ... gcloud compute os-login describe-profile

大多数公共密钥引用已经删除的VM实例。如何执行此列表的清理?还是根本不存储该公钥?

4 个答案:

答案 0 :(得分:0)

这些密钥存储在您的Project Metadata中,您可以通过删除Google控制台UI来删除它们

答案 1 :(得分:0)

就像您在问题中提到OS登录一样:有一种方法可以使用this command从用户的个人资料中删除特定的SSH密钥。另外,我建议您像John Hanley一样,不执行SCP,而是将要复制的文件放入Storage中的实例中,然后通过启动脚本来检索它(您也可以使用自定义的Compute映像)。

答案 2 :(得分:0)

一种对我有用的非常粗略的方法是:

for i in $(gcloud compute os-login ssh-keys list); do echo $i; gcloud compute os-login ssh-keys remove --key $i; done

删除几十个键后,我停止了此操作(使用Control-C),然后又恢复了工作。

实际上,在GUI的项目元数据中,我不是看到很多键。仅:

  • gke ... cidr:网络名称...
  • sshKeys:gke-e9 ...
  • SSH密钥=> peter_v:ssh-rsa我的公共密钥

答案 3 :(得分:0)

永久解决方案是使用 --ssh-key-expire-after 30s。 您仍然需要使用上面的解决方案或更多的命令 kungfu 像这样(没有 grep)清理现有的密钥。

for i in $(gcloud compute os-login ssh-keys list --format="table[no-heading](value.fingerprint)"); do 
  echo $i; 
  gcloud compute os-login ssh-keys remove --key $i || true; 
done

注意:您必须使用违规帐户。 gcloud config account activate ACCOUNT 和/或 gcloud auth activate-service-account --key-file=FILEgcloud auth login

在脚本中需要一个新的 ssh 密钥:

# KEYNAME should be something like $HOME/.ssh/google_compute_engine
ssh-keygen -t rsa -N "" -f "${KEYNAME}" -C "${USERNAME}" || true
chmod 400 ${KEYNAME}*

cat > ssh-keys <<EOF
${USERNAME}:$(cat ${KEYNAME}.pub)
EOF

测试此解决方案:

while :; do
  USERNAME=testing@test-project.iam.gserviceaccount.com
  KEYNAME=~/.ssh/google_compute_engine
  rm -f ~/.ssh/google_compute_engine*
  ssh-keygen -t rsa -N "" -f "${KEYNAME}" -C "${USERNAME}" || true
  chmod 400 ${KEYNAME}*
  cat > ssh-keys <<EOF
  ${USERNAME}:$(cat ${KEYNAME}.pub)
EOF
  gcloud --project=test-project compute ssh --ssh-key-expire-after 30s one-bastion-to-rule-them-all -- date
  gcloud --project=test-project compute os-login ssh-keys list --format="table[no-heading](value.fingerprint)" \
    |wc -l
done