我正在使用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实例。如何执行此列表的清理?还是根本不存储该公钥?
答案 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的项目元数据中,我不是看到很多键。仅:
答案 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=FILE
或 gcloud 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