Mar 212014
 

I’m a big fan of using MultiSSH for performing quick hacks on multiple hosts at once. ClusterSSH is nice too. I hate myself for using it, because frankly any form of parallel execution should really use a formal tool, something like Capistrano, but there are times when quick and dirty is what’s required.

The problem is, if the parallel commands you’re executing are all hitting the same network resource at exactly the same time, you can get timeouts, failures, or possibly even look up the daemon. I’m looking at you, Puppet (sometimes “puppetd -t –splay” just doesn’t cut it).

What I like to do to prevent everything being too simultaneous is to precede the command with a random sleep pause, like this:

sleep $(( $RANDOM*8/1000 )); puppetd -t --noop

This will randomly sleep for any time between 1 and 8 seconds before continuing with the Puppet agent update, saving the Puppetmaster and its precious thread count.

This could similiarly be used during YUM or APT updates, but really, if you have to, you should probably be automating these kinds of solutions.


Matt Parsons is a freelance Linux specialist who has designed, built and supported Unix and Linux systems in the finance, telecommunications and media industries.

He lives and works in London.

Sep 182013
 

Indenting lines with leading tabs is an important technique for writing clear and readable code, and are essential in Python where they have syntactic meaning. Many IDEs insert tabs automatically, but if you’re using vi it can be tedious to insert tabs individually. Fortunately, there is an easy shortcut, and it’s a very handy command to remember.

In the vi session, enter command mode by pressing ESC. Then, set the size of the tabs with the following command:

  :set shiftwidth=2

To make this the default, put “set shiftwidth=2” in your ~/.exrc file.

Then, to tab shift the next 13 lines, you’d type a command like this:

13>>


Matt Parsons is a freelance Linux specialist who has designed, built and supported Unix and Linux systems in the finance, telecommunications and media industries.

He lives and works in London.

Sep 052013
 

While operating a MongoDB cluster, it can often be useful in maintenance scripts to check whether a host is the primary or secondary (master or slave). This is easy to do, and can be done without having to authenticate against the database. Scripts can be made simpler as there is no need to shield the login credentials, as there aren’t any.

When one connects a Mongo database process without credentials, using the “mongo” client command, the implicit “test” database is used. This is a default, and a kind of empty chroot database. Even though it’s an empty database, it still has read-only access to replica information. This can be very handy when automating deployment and monitoring scripts.

There are two commands in particular that are useful for determining the status of a replica set member. These are demonstrated in the following console example, which is fairly self-explanatory.

$ mongo localhost:27017
connecting to: localhost:27017/test
> db.isMaster().secondary
false
> db.isMaster().ismaster
true

This could also be executed non-interactively like this:

mongo localhost:27017 --quiet --eval 'db.isMaster().secondary'

Shell Script Snippet: wait for replica synchronization to finish

When resynchronizing a replica set slave, it will report its status as RECOVERING until it completes, at which point it becomes SECONDARY. The simple example below demonstrates a block of bash to test for this.

while [ "$RESULT" != "true" ]; do
   RESULT=$(mongo localhost --quiet --eval 'db.isMaster().secondary');
   sleep 5;
done

This is over-simplified to demonstrate the logic. In a real-world script you’d have an exit clause to prevent an endless loop in the case when the replica node never recovers.

Other useful commands can be discovered while browsing the mongo console. Find these using commands of the format:

  db.help()


Matt Parsons is a freelance Linux specialist who has designed, built and supported Unix and Linux systems in the finance, telecommunications and media industries.

He lives and works in London.

Jul 302013
 

The IP address that a host presents to the Internet is probably not the same one on its network interface, thanks to the magic of NAT. The difficulty of obtaining this address comes from the fact that one must effectively “ask” an outside source for the answer, since the host and internal network is not in charge of allocating this address, and therefore doesn’t know it. Fortunately, this can be accomplished easily with a simple command line.

One can use wget or curl for this (this example uses wget) and the external site ipecho.net, which offers an unformatted page displaying the IP address.

   wget -q -O - http://ipecho.net/plain && echo

This expression could be executed inside a subshell and the result written to a variable. From here, this information could be useful for checking that a VPN client is connected.


Matt Parsons is a freelance Linux specialist who has designed, built and supported Unix and Linux systems in the finance, telecommunications and media industries.

He lives and works in London.