Mike Bjorge
Mike Bjorge

Reputation: 2111

Run ssh commands across all gce instances

I have a bunch of GCE instances and I want to run the same shell command on all of them. Is it possible to do something like gcloud compute ssh --command="ls -al" my-instance1 my-instance2 my-instance3?

Upvotes: 3

Views: 2054

Answers (2)

jabbson
jabbson

Reputation: 4913

To add to Mike's answer, here is how to do the same without Substring Removal:

for i z in $(gcloud compute instances list --format='value(name, zone)'); do 
  gcloud compute ssh $i --command="ls -lah" --zone=$z; 
done

Upvotes: 3

Mike Bjorge
Mike Bjorge

Reputation: 2111

You can use gcloud compute instances list --format='value[separator=","](name,zone)' to get a list like:

my-instance1,my-zone1
my-instance2,my-zone2
my-instance3,my-zone3

Then you can use bash Substring Removal to extract the parts before and after the comma.

var="before,after"
before="${var%,*}"
after="${var#*,}"

Put it all in a loop and add trailing '&' to run things in the background:

for instance in $(gcloud compute instances list --format='value[separator=","](name,zone)'); do
  name="${instance%,*}";
  zone="${instance#*,}";
  gcloud compute ssh $name --zone=$zone --command="ls -al" &
done

Upvotes: 5

Related Questions