我正在尝试创建一个gcloud命令,它可以对计算引擎实例进行大量元数据更新。
通常情况下,我只需将gcloud compute instances list输送到xargs gcloud compute instances add-metadata。但是,由于某些难以解释的原因,add-metadata需要一个实例名和一个区域,尽管计算实例名似乎是全局唯一的,但这一做法受到了阻碍。因此,现在我不得不尝试将这两部分数据(包括名称和区域)传送到metadata命令。如果我不提供两者,我就得到:
ERROR: (gcloud.compute.instances.add-metadata) Underspecified resource [worker-1]. Specify the [--zone] flag.我已经准备好放弃bash/xargs咒语,转而使用python了,但我想我应该先看看这里。
我有这样的命令:
gcloud compute instances list \
--filter="name~'worker' AND zone~'us-central1'" \
--format 'value(name,zone)'它返回的内容如下:
worker-1 us-central1-c
worker-2 us-central1-c
worker-3 us-central1-c
worker-4 us-central1-c然后,我需要将这些输入到如下命令中:
gcloud compute instances add-metadata --zone=[zone goes here] --metadata myvalue=true [instance name goes here]但是仅仅使用xargs就证明了这很棘手/很烦人。是否有更好或更简单的方法来完成我正在尝试的事情?
发布于 2022-07-26 19:05:46
将其传输到同时读取序列:
gcloud compute instances list \
--filter="name~'worker' AND zone~'us-central1'" \
--format 'value(name,zone)' | \
while read instance zone; do
gcloud compute instances add-metadata \
--zone=$zone --metadata myvalue=true $instance
done发布于 2022-07-26 19:57:04
您可以在“中间”包装一个sh,以帮助处理位置参数。在您的示例中,您可以在CLI下面运行,注意到它将echo它将要运行的gcloud命令,然后,一旦满意地使用生成的命令集,要么在那里删除echo,要么运行整个命令|sh -x:
gcloud compute instances list \
--filter="name~'worker' AND zone~'us-central1'" \
--format 'value(name,zone)' |\
xargs -n2 sh -c \
'echo gcloud compute instances add-metadata --zone="$2" --metadata myvalue=true "$1"' --这里的诀窍是这样的CLI安排:xargs -n2 sh -c '... $1 ... $2' --
-n2让xargs作为一个迷你脚本在two
sh -c '... $1 ... $2' --组中通过argshttps://stackoverflow.com/questions/73128063
复制相似问题