Posts Tagged ‘bash’
Selecting Chef Servers With Environment Variables
Today I got playing around with dynamically selecting different chef servers in preparation for migrating some of our nodes away from our chef-dev server to our chef-live server (which I’m currently in the process of building and populating with data). I had been talking in the #chef IRC channel a few weeks back about making things dynamic, or at least easily switchable, when using multiple chef servers for different groups of servers in an environment.
What I want to do, is be able to set an environment variable at my console in order to switch between chef servers. Previously I had been doing this with different files in my ~/.chef/ directory and changing symlinks between the files. This method works, but is kind of annoying. So with the help of some of the folks in #chef, and with this gist of a sample file that someone is using for their hosted chef environment, I was able to build my own knife.rb and commit it to our chef.git repository.
In our chef.git repository, I created a directory .chef and placed a knife.rb file in it:
$ cd ~/src/chef-repo $ mkdir .chef $ touch .chef/knife.rb
I then filled knife.rb with the following contents:
current_dir = File.dirname(__FILE__)
sys_user = ENV["USER"]
log_level :info
log_location STDOUT
node_name sys_user
client_key "#{ENV["HOME"]}/.chef/#{ENV["KNIFE_ENV"]}/#{ENV["USER"]}.pem"
validation_client_name "chef-validator"
validation_key "#{ENV["HOME"]}/.chef/#{ENV["KNIFE_ENV"]}/validator.pem"
chef_server_url "http://chef-#{ENV["KNIFE_ENV"]}.shifteight.org:4000"
cache_type 'BasicFile'
cache_options( :path => "#{ENV['HOME']}/.chef/checksums" )
cookbook_path [ "#{current_dir}/../cookbooks", "#{current_dir}/../site-cookbooks" ]
The main key is the KNIFE_ENV environment variable which I set using: export KNIFE_ENV=dev or export KNIFE_ENV=live
After setting the environment variable, which server I’m using is selected for me. Additionally, I copied my validation.pem and client.pem files into corresponding directories in my ~/.chef/ directory: $ mkdir ~/.chef/{live,dev}
With all that done, I can now easily switch between our different servers in order to start the migration of our nodes. (I might create another blog post about that in the future if I get a chance.)
“BUT HOW DO I KNOW WHICH ENVIRONMENT I’M WORKING WITH?!?!?!”, you say? Oh fancy this little PS1 and function I added to my ~/.bashrc file:
if [ "$KNIFE_ENV" == "" ]; then
export KNIFE_ENV="dev"
fi
function which_env {
if [ "$KNIFE_ENV" == "live" ]; then
echo "31"
else
echo "32"
fi
}
export PS1='[\u@\h \[\033[0;36m\]\W$(__git_ps1 "\[\033[0m\]\[\033[0;33m\](%s) \[\033[0;`which_env`m\]~$KNIFE_ENV~")\[\033[0m\]]\$ '
Is nice
bash creating files named ’1′ everywhere!
So I ran into something kind of stupid today
Adding a little note for anyone who might run into a similar instance.
I have some ssh-add stuff that gets run in my .bashrc file, but when I was outputting it, I was doing:
ssh-add ~/.ssh/some_key > /dev/null 2&>1
Note the 2&>1 at the end. That means to redirect output to a file named 1. You need to flip the &> into >&, so the fixed version looks like:
ssh-add ~/.ssh/some_key > /dev/null 2>&1
.bashrc trick for git repo and branch information
The other day I was talking to my friend Russell Bryant who pointed me to some .bashrc magic that would show me which branch I was currently working with inside a git repo on my system. I found it incredibly handy and have modified the ANSI colour coding slightly.
export PS1='[\u@\h \[33[0;36m\]\W$(__git_ps1 "\[33[0m\]\[33[0;33m\](%s)")\[33[0m\]]\$ '
On Fedora Russell mentioned that you need the bash-completion installed. We’re unsure if you need anything on other distributions.
Edit: January 6, 2012
As I’m using my laptop today, I modified the .bashrc file on Ubuntu 10.04, and here is the PS1 code I came up with. It’s nearly the same, but I’m using bold today instead of the unbolded colours of lore.
PS1='${debian_chroot:+($debian_chroot)}\[\033[28;01m\]\u@\h\[\033[00m\]:\[\033[1;36m\]\W$(__git_ps1 "\[\033[00m\]\[\033[1;33m\](%s)")\[\033[00m\]\$ '
Return just PID of script with ‘ps’ and ‘awk’
Today I ran into an issue where I am running a python script that I needed to get the process ID (PID) of, but that the process was being output with a space between ‘python’ and the actual script name (in this case, jiraircbot.py).
I’m sure it’s totally overkill and there is a much easier way I didn’t find to do this, but after some scouring of The Google, I found something that works! (The purpose of this was to kill off a rogue script process each night so I could restart it.)
Here is what the output looks like with just ps aux | grep python
# ps aux | grep python root 1120 0.0 0.2 50176 4380 ? Sl Aug04 24:52 /usr/bin/python /usr/bin/fail2ban-server -b -s /var/run/fail2ban/fail2ban.sock root 18182 2.2 1.5 35328 32148 pts/0 S 08:21 0:11 python jiraircbot.py root 18219 0.0 0.0 3328 804 pts/0 S+ 08:29 0:00 grep python
A little bit more data than I wanted, plus of course ‘grep python’ is always going to be returned if I just use grep straight up. Putting many pieces together from a few websites, this is what I came up with to just return the PID of the jiraircbot.py script:
ps -eo pid,command | grep "jiraircbot.py" | grep -v grep | awk '{print $1}'
What I’m doing, is controlling what is returned, so in this case have ps just return the pid and command fields. Run that through grep to just get the script I wanted, pipe that back through grep to remove the line including grep python and then pipe that through awk to just return the first field (which would be the pid of the process I wanted).
All in all, a nice hack
