Bash script to add multiple resources to NFS pacemaker cluster


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Bash script to add multiple resources to NFS pacemaker cluster
# 1  
Old 07-25-2019
Bash script to add multiple resources to NFS pacemaker cluster

All,

I'm looking for some guidance on how to accomplish automating the addition of exports to an HA Pacemaker NFS cluster. I would like to do it in bash for logistics reasons.

The resource creation command looks like this:

Code:
pcs resource create nfs-b2b-hg-media-10.1 exportfs clientspec=10.1.0.0/255.255.0.0 options=rw,sync,no_root_squash directory=/nfs/exports/media fsid=1 --group nfsgroup

However, I would like the script to be able to add multiple exports at one time and am trying to figure out the best way to do it. I have been playing around with arrays and can gather 2 of the necessary variables in the command, but there are 4 needed variables:

Code:
resource_name --> nfs-b2b-hg-media-10.1
clientspec --> 10.1.0.0/255.255.0.0
directory --> /nfs/exports/media
fsid --> 1

The rest of the command is pretty static.

Here is a small test script that gathers resource name and clientspec (and puts in order):

Code:
#!/usr/bin/bash

cs10168="10.16.8.0/255.255.255.0"
cs101="10.1.0.0/255.255.0.0"
cs1091="10.91.0.0/255.255.0.0"
dirs=(media hotdrive images)
nfsenv="nfs-b2b-hg"
nfsoptions="rw,sync,no_root_squash"
lv=exports
mt="/nfs"
nfsgrp=nfsgroup

declare -A exports
exports[${nfsenv}-${dirs[0]}-10.1]=${cs101}
exports[${nfsenv}-${dirs[1]}-10.91]=${cs1091}
exports[${nfsenv}-${dirs[2]}-10.1]=${cs101}
exports[${nfsenv}-${dirs[2]}-10.91]=${cs1091}

declare -a orders
orders+=( ${nfsenv}-${dirs[0]}-10.1 )
orders+=( ${nfsenv}-${dirs[1]}-10.91 )
orders+=( ${nfsenv}-${dirs[2]}-10.1 )
orders+=( ${nfsenv}-${dirs[2]}-10.91 )

for i in ${orders[@]}

do

       pcs resource create $i exportfs clientspec=${exports[$i]} options=$nfsoptions directory=${mt}/${lv}/${dirs[0]} fsid=1 --group $nfsgrp

done

As you can see there is a problem with how to define 'directory' and 'fsid'.

Does anyone have any suggestions on how to accomplish this in bash? Any guidance is greatly appreciated.

Thanks,

HB

Last edited by hicksd8; 07-26-2019 at 07:00 AM..
# 2  
Old 07-26-2019
Is this what your after, remove echo to implement if it matches what you want.

Code:
nfsenv="nfs-b2b-hg"
nfsoptions="rw,sync,no_root_squash"
lv=exports
mt="/nfs"
nfsgrp=nfsgroup
dirs_list="media hotdrive images"
clispec_list="10.16.8.0/255.255.255.0 10.1.0.0/255.255.0.0 10.91.0.0/255.255.0.0"

for clispec in $clispec_list
do
   clrm=${clispec#*.}
   clrm=.${clrm#*.}
   clispec2=${clispec%$clrm}

   for dirs in $dirs_list
   do
      echo pcs resource create $nfsenv-$dirs-$clispec2 clientspec=$clispec options=$nfsoptions directory=$mt/$lv/$dirs fsid=1 --group $nfsgrp
   done
done

# 3  
Old 07-26-2019
Thank you for the reply. Actually, I believe I described the desired command output poorly. In the snippet I posted, the 'exports' array would define the resources that I'd want to define:

Code:
declare -A exports
exports[${nfsenv}-${dirs[0]}-10.1]=${cs101}
exports[${nfsenv}-${dirs[1]}-10.91]=${cs1091}
exports[${nfsenv}-${dirs[2]}-10.1]=${cs101}
exports[${nfsenv}-${dirs[2]}-10.91]=${cs1091}

So the commands I'd want to run would be:

Code:
pcs resource create nfs-b2b-hg-media-10.1 exportfs clientspec=10.1.0.0/255.255.0.0 options=rw,sync,no_root_squash directory=/nfs/exports/media fsid=1 --group nfsgroup
pcs resource create nfs-b2b-hg-hotdrive-10.91 exportfs clientspec=10.91.0.0/255.255.0.0 options=rw,sync,no_root_squash directory=/nfs/exports/hotdrive fsid=2 --group nfsgroup
pcs resource create nfs-b2b-hg-images-10.1 exportfs clientspec=10.1.0.0/255.255.0.0 options=rw,sync,no_root_squash directory=/nfs/exports/images fsid=3 --group nfsgroup
pcs resource create nfs-b2b-hg-images-10.91 exportfs clientspec=10.91.0.0/255.255.0.0 options=rw,sync,no_root_squash directory=/nfs/exports/images fsid=3 --group nfsgroup

Notice the need to increment the 'fsid' based upon the exported directory (media=1, hotdrive=2, images=3). If a given directory is exported to multiple subnets, it will maintain the same 'fsid'.

I will test further and welcome any suggestions.

Thanks,

HB
# 4  
Old 07-26-2019
Lets look at this solution:

Code:
nfsenv="nfs-b2b-hg"
nfsoptions="rw,sync,no_root_squash"
lv=exports
mt="/nfs"
nfsgrp=nfsgroup
dirs_list="media hotdrive images"

clispec=(10.16.8.0/255.255.255.0 10.1.0.0/255.255.0.0 10.91.0.0/255.255.0.0)
cli2=(10.16 10.1 10.91)

drive=(media hotdrive images)
fsid=(1 2 3)

for((c=0;c<${#clispec[@]};c++))
do
   for((i=0;i<${#drive[@]};i++))
   do
      echo pcs resource create $nfsenv-${drive[i]}-${cli2[c]} exportfs clientspec=${clispec[c]} options=$nfsoptions directory=$mt/$lv/${drive[i]} fsid=${fsid[i]} --group $nfsgrp
   done
done

Here we are running two paired arrays clispec/cli2 and drive/fsid.

Although we could derive cli2 from clispec (first two octets) and fsid could be array index + 1 it's more useful as a general example to show how we can step thru the arrays with a counter and reference matching entries. For example drive[0]="media" and fsid[0]="1".

This idea also ends up being more useful if, for example, you wanted to add another entry to clispec array with 10.16.12.0/255.255.255.0 and make its cli2 value 10.16(2)
This User Gave Thanks to Chubler_XL For This Post:
# 5  
Old 07-28-2019
Thanks again for the reply. The problem with this solution in my case is it loops through all drives and adds each of them to all subnets.

I need to be able to define individual drives for specific subnets. Not all the exports will need to be presented to all subnets. I.E.:

Code:
 pcs resource create nfs-b2b-hg-media-10.1 exportfs clientspec=10.1.0.0/255.255.0.0 options=rw,sync,no_root_squash directory=/nfs/exports/media fsid=1 --group nfsgroup
pcs resource create nfs-b2b-hg-hotdrive-10.91 exportfs clientspec=10.91.0.0/255.255.0.0 options=rw,sync,no_root_squash directory=/nfs/exports/hotdrive fsid=2 --group nfsgroup
pcs resource create nfs-b2b-hg-images-10.1 exportfs clientspec=10.1.0.0/255.255.0.0 options=rw,sync,no_root_squash directory=/nfs/exports/images fsid=3 --group nfsgroup
pcs resource create nfs-b2b-hg-images-10.91 exportfs clientspec=10.91.0.0/255.255.0.0 options=rw,sync,no_root_squash directory=/nfs/exports/images fsid=3 --group nfsgroup

My use case is to add new exports (this is just one part of a larger script that also partitions drives, creates volume groups, logical volumes, etc) to the cluster for varying needs.

I'm still troubleshooting, the paired arrays look encouraging..

Thanks again,

HB
# 6  
Old 07-28-2019
This idea comes to mind. Have a 3rd array with list of drives for subnet:

Code:
nfsenv="nfs-b2b-hg"
nfsoptions="rw,sync,no_root_squash"
lv=exports
mt="/nfs"
nfsgrp=nfsgroup

clispec=(10.16.8.0/255.255.255.0 10.1.0.0/255.255.0.0 10.91.0.0/255.255.0.0)
cli2=(10.16 10.1 10.91)
cl_drives=("" "media images" "hotdrive images")

drive=(media hotdrive images)
fsid=(1 2 3)

for((c=0;c<${#clispec[@]};c++))
do
   for drv in ${cl_drives[c]}
   do
       for((i=0;i<${#drive[@]};i++))
       do
           [ "${drive[i]}" = "$drv" ] &&
               echo pcs resource create $nfsenv-${drive[i]}-${cli2[c]} exportfs clientspec=${clispec[c]} options=$nfsoptions directory=$mt/$lv/${drive[i]} fsid=${fsid[i]} --group $nfsgrp
       done
   done
done

This User Gave Thanks to Chubler_XL For This Post:
# 7  
Old 07-29-2019
@Chubler_XL - Thank you very much for the guidance, this appears to work as needed.

This will allow me to move forward with the rest of the needs, I will mark this as solved..

Thanks again,

HB
Login or Register to Ask a Question

Previous Thread | Next Thread

8 More Discussions You Might Find Interesting

1. Red Hat

PaceMaker Cluster Fence Device

I have 2 VM's setup with a shared VMware disk running RHEL 7.1 (just updated to 7.2 with yum update), and would like to know what is the easiest Fence device to implement for testing purposes. Apparently, I need a fence device before my IP resources will come online. I have the cluster... (1 Reply)
Discussion started by: mrmurdock
1 Replies

2. Shell Programming and Scripting

Loop through multiple files in bash script

Hi Everybody, I'm a newbie to shell scripting, and I'd appreciate some help. I have a bunch of .txt files that have some unwanted content. I want to remove lines 1-3 and 1028-1098. #!/bin/bash for '*.txt' in <path to folder> do sed '1,3 d' "$f"; sed '1028,1098 d' "$f"; done I... (2 Replies)
Discussion started by: BabyNuke
2 Replies

3. Shell Programming and Scripting

Mount NFS Share On NFS Client via bash script.

I need a help of good people with effective bash script to mount nfs shared, By the way I did the searches, since i haven't found that someone wrote a script like this in the past, I'm sure it will serve more people. The scenario as follow: An NFS Client with Daily CRON , running bash script... (4 Replies)
Discussion started by: Brian.t
4 Replies

4. Homework & Coursework Questions

NFS service not started in Redhat Cluster

Hi All, Need your help to resolve below error in cluter. Sep 9 05:37:30 node2 rgmanager: Starting disabled service service:Prod_Service Sep 9 05:37:30 node2 rgmanager: HA LVM: Improper setup detected Sep 9 05:37:30 node2 rgmanager: * initrd image needs to be newer than lvm.conf... (3 Replies)
Discussion started by: nitinredekar
3 Replies

5. Shell Programming and Scripting

Bash script to copy timestamps of multiple files

Hi, I have a bunch of media files in a directory that have been converted (from MTS to MOV format), so my directory contains something like this: clip1.mts clip1.mov clip2.mts clip2.mov The problem is that the .mov files that have been created have the timestamps of the conversion task,... (2 Replies)
Discussion started by: Krakus
2 Replies

6. Shell Programming and Scripting

Multiple Variables for BASH script

Hello, I am new to the whole "scripting" thing. Below is the script that I have so far and where i need the Variables to go (VAR#) #!/bin/bash #Sample Script VAR1= echo "Choose an option: 1) Create a file. 2) Delete a file. 3) Move a file." read VAR1 case $VAR1 in 1) echo "Pick... (4 Replies)
Discussion started by: eclerget
4 Replies

7. Shell Programming and Scripting

bash script to rename multiple directories

Hello I have a directory structure with year in format 4 digits, e.g 2009, below which is month format 1 or 2 digits, e.g 1 or 12, blow which is day format 1 or 2 digits, e.g 1 or 31. I want to change the names of lots of directories to the be Year - 4 digits , e.g 2009 - No change here... (4 Replies)
Discussion started by: garethsays
4 Replies

8. High Performance Computing

cluster setup and nfs

hello, During the cluster installation, we are required to enter a cluster name. When this name is used? I have a shared disk between those 2 nodes. To test NFS failover, what should I do? PS: I am using VCS 5 thanks (5 Replies)
Discussion started by: melanie_pfefer
5 Replies
Login or Register to Ask a Question