go get -u github.com/grubernaut/cdsh
The remote shell exec for consul services.
cdsh --server <consul-server-address> --service <consul-service> --user <username> '<bash command to execute>'
Note: Be sure that you're actually able to SSH to the target consul service. (SSH Keys, Host key verification, etc)
--server/-s: Consul server to query against. Required. Can also useCONSUL_SERVER, but environment variable takes priority.--service/-S: Target service to run command against--user/-u: Remote user to connect as. If unspecified, defaults to current local user
More options are likely to come in the future, such as --tag --token, --node, etc...
If --service is left unspecified, cdsh will return a list of all available services. This will likely be changed
in the future to a separate flag entirely.
While consul does have a native exec command, there are a couple issues with using consul exec.
Agents are informed about the new job using the event system, which propagates messages via the gossip protocol. As a result, delivery is best-effort, and there is no guarantee of execution. ... While events are purely gossip driven, remote execution relies on the KV store as a message broker.
Using Consul K/V as a message broker definitely has it's benefits, but there are often times in daily operations work, where a user might want to know immediately if they cannot connect to a service.
However, the main concern with using consul exec is as follows:
Verbose output warning: use care to make sure that your command does not produce a large volume of output. Writes to the KV store for this output go through the Consul servers and the Raft consensus algorithm, so having a large number of nodes in the cluster flow a large amount of data through the KV store could make the cluster unavailable.
There are quite a few times where I've needed to fetch fairly verbose log output from N-servers, and pipe the output to a file for further analysis. Using DSH completely abstracts the command output from Consul K/V, allowing the user to run fairly verbose commands without worry.