我正在尝试编写一个 gcloud 命令,对计算引擎实例进行批量元数据更新。
通常我可以通过管道传输gcloud compute instances list到xargs gcloud compute instances add-metadata. 但是,这会受到阻碍,因为由于某些无法解释的原因,即使计算实例名称似乎是全局唯一的,也add-metadata需要实例名称和区域。因此,现在我被迫尝试将两条数据(名称和区域)传输到 add-metadata 命令。如果我不提供两者,我会得到:
ERROR: (gcloud.compute.instances.add-metadata) Underspecified resource [worker-1]. Specify the [--zone] flag.
Run Code Online (Sandbox Code Playgroud)
我准备放弃 bash/xargs 咒语并切换到 python,但我想我应该先检查这里。
我有这个命令:
gcloud compute instances list \
--filter="name~'worker' AND zone~'us-central1'" \
--format 'value(name,zone)'
Run Code Online (Sandbox Code Playgroud)
它返回类似:
worker-1 us-central1-c
worker-2 us-central1-c
worker-3 us-central1-c
worker-4 us-central1-c
Run Code Online (Sandbox Code Playgroud)
然后我需要将它们通过管道传输到如下命令中:
gcloud compute instances add-metadata --zone=[zone goes here] --metadata myvalue=true [instance name goes here]
Run Code Online (Sandbox Code Playgroud)
但事实证明,单独使用 xargs 是很棘手/烦人的。有没有更好或更简单的方法来完成我正在尝试的事情?
将其传送到 while read 序列:
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
Run Code Online (Sandbox Code Playgroud)