I recently built a replicated DRBD, Heartbeat, & iSCSI Target Initiator storage server on Ubuntu 10.04 to offer shared storage to server Vmware ESX and Microsoft Clusters. Everything works flawlessly, however I wanted to make a script to create, remove, grow volumes to offer ESX rather then having a technical diagram and instructions so that other technicians are able to do this process with limited Linux knowledge.
I know the basis to Linux scripting with variables and command scripting but I am not sure how to approach parsing a configuration file for iSCSI Target Initiator and adding lines between existing lines under a sub group. I figure it has to be done in an array but I am not sure how to keep it within a parameter as well as add a line adding the next sequential number available.
Let me give an example of my configuration file called ietd.conf:
What I need to do is when my script asks the user which Server they wish to add storage too (lets say ESX) that it targets �Target iqn.2011-03.stroageserver.workgroup.net:VMware.Storage.1� and reads each �Lun #.....� and adds a line below LUN 2 (in example configuration file) as LUN 3? I will replace �/dev/replicated/<volume>� with a variable which I can do. I just do not know how to parse only the lines between �Target iqn� and the next �Target ign� looking for �LUN #� and adding a new line below the existing LUN with a higher sequential number.
I am also not sure how to approach gaps in LUN numbers when volumes are deleted. My assumption is to take the highest LUN # under the target and add one to it but I am not sure if this is correct?
#!/bin/bash
servername=Microsoft.Storage.1 #to find appropriate paragraph
nums=( $( awk '
/'"$servername"'/,/^\s*$/ { #process only between $servername and empty line
if(/Lun/){numLun=$2; numRec=FNR} #if found line with 'Lun', capture 2nd field and line number
}
END{
print numLun" "numRec
} ' ietd.conf ) )
#nums is an array; first element is the field right after 'Lun'
#and second element is its line number
newEntry="Lun $((${nums[0]}+1)) and whatever else you enter" #what should be inserted
sed "${nums[1]} a \\\t$newEntry" ietd.conf #'a' command (append) to the appropriate line
Thank you! I was able to utilize what you gave me with variables to make it work in my script perfectly.
I am working on my delete part of my script where now I am looking to gather all the LUN #'s under a particular field from the ietd.conf file (such as "Target iqn.2011-03.stroageserver.workgroup.net:VMware.Storage.1" and offer them to the user as a selection choice such as:
I have two questions as I am not familiar with the perl programming language.
1) When I execute what you gave me against the ietd.conf file I am prompted to "Enter option:" but nothing is printed on the screen telling me the available options or lines that it has found. No matter what I type I get the die "Invalid Option" and exit.
2) My current script is built in /bin/bash can I make perl and bash work together as my future plan is it extract Path="/dev/replicated/<name>" into a variable of the line being removed from ietd.conf for my second stage of deleting the lvm.
It's working fine at my end see the below o/p. I have modified my perl code in my previous post.You can see how to pass variable to bash script from perl.
ietd.conf file