Some fun updates for vagrant hackers… I wanted to use the venerable clustered SSH (cssh) and screen with vagrant. I decided to expand on my vsftp script. First read:
and
to get up to speed on the background information.
Vagrant screen:
First, a simple screen hack… I often use my vssh alias to quickly ssh into a machine, but I don’t want to have to waste time with sudo-ing to root and then running screen each time. Enter vscreen:
# vagrant screen
function vscreen {
[ "$1" = '' ] || [ "$2" != '' ] && echo "Usage: vscreen <vm-name> - vagrant screen" 1>&2 && return 1
wd=`pwd` # save wd, then find the Vagrant project
while [ "`pwd`" != '/' ] && [ ! -e "`pwd`/Vagrantfile" ] && [ ! -d "`pwd`/.vagrant/" ]; do
#echo "pwd is `pwd`"
cd ..
done
pwd=`pwd`
cd $wd
if [ ! -e "$pwd/Vagrantfile" ] || [ ! -d "$pwd/.vagrant/" ]; then
echo 'Vagrant project not found!' 1>&2 && return 2
fi
d="$pwd/.ssh"
f="$d/$1.config"
h="$1"
# hostname extraction from user@host pattern
p=`expr index "$1" '@'`
if [ $p -gt 0 ]; then
let "l = ${#h} - $p"
h=${h:$p:$l}
fi
# if mtime of $f is > than 5 minutes (5 * 60 seconds), re-generate...
if [ `date -d "now - $(stat -c '%Y' "$f" 2> /dev/null) seconds" +%s` -gt 300 ]; then
mkdir -p "$d"
# we cache the lookup because this command is slow...
vagrant ssh-config "$h" > "$f" || rm "$f"
fi
[ -e "$f" ] && ssh -t -F "$f" "$1" 'screen -xRR'
}
I usually run it this way:
$ vscreen root@machine
which logs in as root, to machine and gets me (back) into screen. This is almost identical to the vsftp script which I explained in an earlier blog post.
Vagrant cssh:
First you’ll need to install cssh. On my Fedora machine it’s as easy as:
# yum install -y clusterssh
I’ve been hacking a lot on Puppet-Gluster lately, and occasionally multi-machine hacking demands multi-machine key punching. Enter vcssh:
# vagrant cssh
function vcssh {
[ "$1" = '' ] && echo "Usage: vcssh [options] [user@]<vm1>[ [user@]vm2[ [user@]vmN...]] - vagrant cssh" 1>&2 && return 1
wd=`pwd` # save wd, then find the Vagrant project
while [ "`pwd`" != '/' ] && [ ! -e "`pwd`/Vagrantfile" ] && [ ! -d "`pwd`/.vagrant/" ]; do
#echo "pwd is `pwd`"
cd ..
done
pwd=`pwd`
cd $wd
if [ ! -e "$pwd/Vagrantfile" ] || [ ! -d "$pwd/.vagrant/" ]; then
echo 'Vagrant project not found!' 1>&2 && return 2
fi
d="$pwd/.ssh"
cssh="$d/cssh"
cmd=''
cat='cat '
screen=''
options=''
multi='f'
special=''
for i in "$@"; do # loop through the list of hosts and arguments!
#echo $i
if [ "$special" = 'debug' ]; then # optional arg value...
special=''
if [ "$1" -ge 0 -o "$1" -le 4 ]; then
cmd="$cmd $i"
continue
fi
fi
if [ "$multi" = 'y' ]; then # get the value of the argument
multi='n'
cmd="$cmd '$i'"
continue
fi
if [ "${i:0:1}" = '-' ]; then # does argument start with: - ?
# build a --screen option
if [ "$i" = '--screen' ]; then
screen=' -o RequestTTY=yes'
cmd="$cmd --action 'screen -xRR'"
continue
fi
if [ "$i" = '--debug' ]; then
special='debug'
cmd="$cmd $i"
continue
fi
if [ "$i" = '--options' ]; then
options=" $i"
continue
fi
# NOTE: commented-out options are probably not useful...
# match for key => value argument pairs
if [ "$i" = '--action' -o "$i" = '-a' ] || \
[ "$i" = '--autoclose' -o "$i" = '-A' ] || \
#[ "$i" = '--cluster-file' -o "$i" = '-c' ] || \
#[ "$i" = '--config-file' -o "$i" = '-C' ] || \
#[ "$i" = '--evaluate' -o "$i" = '-e' ] || \
[ "$i" = '--font' -o "$i" = '-f' ] || \
#[ "$i" = '--master' -o "$i" = '-M' ] || \
#[ "$i" = '--port' -o "$i" = '-p' ] || \
#[ "$i" = '--tag-file' -o "$i" = '-c' ] || \
[ "$i" = '--term-args' -o "$i" = '-t' ] || \
[ "$i" = '--title' -o "$i" = '-T' ] || \
[ "$i" = '--username' -o "$i" = '-l' ] ; then
multi='y' # loop around to get second part
cmd="$cmd $i"
continue
else # match single argument flags...
cmd="$cmd $i"
continue
fi
fi
f="$d/$i.config"
h="$i"
# hostname extraction from user@host pattern
p=`expr index "$i" '@'`
if [ $p -gt 0 ]; then
let "l = ${#h} - $p"
h=${h:$p:$l}
fi
# if mtime of $f is > than 5 minutes (5 * 60 seconds), re-generate...
if [ `date -d "now - $(stat -c '%Y' "$f" 2> /dev/null) seconds" +%s` -gt 300 ]; then
mkdir -p "$d"
# we cache the lookup because this command is slow...
vagrant ssh-config "$h" > "$f" || rm "$f"
fi
if [ -e "$f" ]; then
cmd="$cmd $i"
cat="$cat $f" # append config file to list
fi
done
cat="$cat > $cssh"
#echo $cat
eval "$cat" # generate combined config file
#echo $cmd && return 1
#[ -e "$cssh" ] && cssh --options "-F ${cssh}$options" $cmd
# running: bash -c glues together --action 'foo --bar' type commands...
[ -e "$cssh" ] && bash -c "cssh --options '-F ${cssh}${screen}$options' $cmd"
}
This can be called like this:
$ vcssh annex{1..4} -l root
or like this:
$ vcssh root@hostname foo user@bar james@machine --action 'pwd'
which, as you can see, passes cssh arguments through! Can you see any other special surprises in the code? Well, you can run vcssh like this too:
$ vcssh root@foo james@bar --screen
which will perform exactly as vscreen did above, but in cssh!
You’ll see that the vagrant ssh-config lookups are cached, so this will be speedy when it’s running hot, but expect a few seconds delay when you first run it. If you want a longer cache timeout, it’s easy to change yourself in the function.
I’ve uploaded the code here, so that you don’t have to copy+paste it from my blog!
Happy hacking,
James
2020 has not been a year we would have been able to predict. With a worldwide pandemic and lives thrown out of gear, as we head into 2021, we are thankful that our community and project continued to receive new developers, users and make small gains. For that and a...
It has been a while since we provided an update to the Gluster community. Across the world various nations, states and localities have put together sets of guidelines around shelter-in-place and quarantine. We request our community members to stay safe, to care for their loved ones, to continue to be...
The initial rounds of conversation around the planning of content for release 8 has helped the project identify one key thing – the need to stagger out features and enhancements over multiple releases. Thus, while release 8 is unlikely to be feature heavy as previous releases, it will be the...