[rudder-users] management of filesystems and lvm

Marco RODRIGUES marco at adeti.org
Thu Jul 3 15:17:18 CEST 2014


Hi all,

I go forward with my implementation.
I have now something that seems operational and meets my current needs.

Before to do some work to integrate it in rudder, I ask for your opinion
on  :
- the value of this code to be integrated the project.
- which improvements have to be done before integrated in rudder.
- and which improvements should be done after to be integrated in rudder.

You can find the file with my code joined in this mail.


B/R.
Marco.


-------------- next part --------------

# @name Filesystems management
# @description Create and check promises filesystems
# @version 0.1

# 30_generic_methods

bundle agent fstab_update_line (mount_name,mount_line) {
  vars:
    "line" string => format("%-41s %-25s %-12s %-25s %d  %d", "${${mount_line}[device]}", "$(mount_name)", "${${mount_line}[type]}", "${${mount_line}[options]}", "${${mount_line}[dump]}", "${${mount_line}[pass]}");
  files:
    "${sys.fstab}"
        edit_line => replace_or_add("(?!#)\S+\s+$(mount_name)\s.+",${line});
 }
body classes if_repaired_two(x,y) { 
        promise_repaired => { ${x}, ${y} };
}
body classes if_repaired_three(x,y,z) { 
        promise_repaired => { ${x}, ${y}, ${z} };
}

# 40_it_ops_knowledge

bundle common filesystems {    
  vars: 
      "pv_count"                                                            int => parsestringarray("pv_array",execresult("/sbin/pvs --separator ';' --noheadings -o pv_uuid,pv_name,vg_name","noshell"),"s*#[^\n]*",";",100,20000);
      "pv_idx"                                                            slist => getindices("pv_array");
      "lv_count"                                                            int => parsestringarray("lv_array",execresult("/sbin/lvs --separator ';' --noheadings -o lv_uuid,lv_name,vg_name,lv_size --units B","noshell"),"s*#[^\n]*",";",100,20000);
      "lv_idx"                                                            slist => getindices("lv_array");
      "fs_list"                                                           slist => splitstring(execresult("/sbin/blkid -o device","noshell"),"$(const.n)","1000");
      "mounted_count"                                                       int => readstringarray("mounted_array","/etc/mtab","\s*#[^\n]*","\s+",100,20000);
      "mounted_idx"                                                       slist => getindices("mounted_array");
      "fstab_count"                                                                   int => readstringarray("fstab_array","/etc/fstab","\s*#[^\n]*","\s+",100,20000);
      "fstab_idx"                                                                   slist => getindices("fstab_array");
      #"filesystems[pv][${pv_array[${pv_idx}][1]}][vg]"                             string => "${pv_array[${pv_idx}][2]}";
      #"filesystems[lv][${lv_array[${lv_idx}][2]}/${lv_array[${lv_idx}][1]}][vg]"   string => "${lv_array[${lv_idx}][2]}";
      "filesystems[lv][${lv_array[${lv_idx}][2]}/${lv_array[${lv_idx}][1]}][size]"   int => "${lv_array[${lv_idx}][3]}";
      "filesystems[fs][${fs_list}][type]"                                          string => execresult("/sbin/blkid -o value -s TYPE ${fs_list}","noshell");
      #"filesystems[mount][${mounted_array[${mounted_idx}][1]}][device]"            string => "${mounted_array[${mounted_idx}][0]}";
      #"filesystems[mount][${mounted_array[${mounted_idx}][1]}][type]"              string => "${mounted_array[${mounted_idx}][2]}";
      #"filesystems[mount][${mounted_array[${mounted_idx}][1]}][options]"           string => "${mounted_array[${mounted_idx}][3]}";
      #"filesystems[mount][${mounted_array[${mounted_idx}][1]}][dump]"                 int => "${mounted_array[${mounted_idx}][4]}";
      #"filesystems[mount][${mounted_array[${mounted_idx}][1]}][pass]"                 int => "${mounted_array[${mounted_idx}][5]}";
      #"filesystems[fstab][${fstab_array[${fstab_idx}][1]}][device]"                string => "${fstab_array[${fstab_idx}][0]}";
      #"filesystems[fstab][${fstab_array[${fstab_idx}][1]}][type]"                  string => "${fstab_array[${fstab_idx}][2]}";
      #"filesystems[fstab][${fstab_array[${fstab_idx}][1]}][options]"               string => "${fstab_array[${fstab_idx}][3]}";
      #"filesystems[fstab][${fstab_array[${fstab_idx}][1]}][dump]"                     int => "${fstab_array[${fstab_idx}][4]}";
      #"filesystems[fstab][${fstab_array[${fstab_idx}][1]}][pass]"                     int => "${fstab_array[${fstab_idx}][5]}";
  classes:
      "fs_${fs_list}" not => regcmp("fs_list", "${fs_list}");
      "fs_${fs_list}_type_${filesystems[fs][${fs_list}][type]}" expression => classify("fs_${fs_list}");
      "fstab_${fstab_array[${fstab_idx}][1]}" not => regcmp("fstab_array", "${fstab_array[${fstab_idx}][1]}"); 
      "fstab_${fstab_array[${fstab_idx}][1]}_device_${fstab_array[${fstab_idx}][0]}_type_${fstab_array[${fstab_idx}][2]}_options_${fstab_array[${fstab_idx}][3]}_dump_${fstab_array[${fstab_idx}][4]}_pass_${fstab_array[${fstab_idx}][5]}" expression => classify("fstab_${fstab_array[${fstab_idx}][1]}");
      "lvm_lv_${lv_array[${lv_idx}][2]}/${lv_array[${lv_idx}][1]}" not => regcmp("lv_array","${lv_array[${lv_idx}][2]}");
      "lvm_lv_${lv_array[${lv_idx}][2]}/${lv_array[${lv_idx}][1]}_size_${lv_array[${lv_idx}][3]}" expression => classify("lvm_lv_${lv_array[${lv_idx}][2]}/${lv_array[${lv_idx}][1]}");
      "lvm_pv_${pv_array[${pv_idx}][1]}" not => regcmp("pv_array","${pv_array[${pv_idx}][1]}");
      "lvm_pv_${pv_array[${pv_idx}][1]}_vg_${pv_array[${pv_idx}][2]}" and => { classify("lvm_pv_${pv_array[${pv_idx}][1]}"), regcmp(".+","${pv_array[${pv_idx}][2]}") };
      "lvm_pv_${pv_array[${pv_idx}][1]}_vg_" expression => classmatch(concat(canonify("lvm_pv_${pv_array[${pv_idx}][1]}_vg_"),".+"));
      "lvm_vg_${pv_array[${pv_idx}][2]}" expression => classify("lvm_pv_${pv_array[${pv_idx}][1]}_vg_${pv_array[${pv_idx}][2]}");
      "mounted_${mounted_array[${mounted_idx}][1]}" not => regcmp("mounted_array","${mounted_array[${mounted_idx}][1]}");
      "mounted_${mounted_array[${mounted_idx}][1]}_device_${mounted_array[${mounted_idx}][0]}_type_${mounted_array[${mounted_idx}][2]}_options_${mounted_array[${mounted_idx}][3]}_dump_${mounted_array[${mounted_idx}][4]}_pass_${mounted_array[${mounted_idx}][5]}" expression => classify("mounted_${mounted_array[${mounted_idx}][1]}");

}   

# 50_techniques

bundle agent lvm_pv_set (pv_array)  {   
  vars:
      "pv_name"  slist => getindices("${pv_array}"),
               comment => "List of names LVM Physical Volumes";
  methods:
      "pvcreate" usebundle => command_execution("/sbin/pvcreate ${pv_name}"),
                ifvarclass => not(canonify("lvm_pv_${pv_name}")),
                   classes => if_repaired("lvm_pv_${pv_name}");
      "vgcreate" usebundle => command_execution("/sbin/vgcreate ${${pv_array}[${pv_name}][vg]} ${pv_name}"),
                ifvarclass => and(canonify("lvm_pv_${pv_name}"), not(canonify("lvm_pv_${pv_name}_vg_")), not(canonify("lvm_vg_${${pv_array}[${pv_name}][vg]}"))),
                   classes => if_repaired_three("lvm_pv_${pv_name}_vg_", "lvm_pv_${pv_name}_vg_${${pv_array}[${pv_name}][vg]}", "lvm_vg_${${pv_array}[${pv_name}][vg]}");
      "vgextend" usebundle => command_execution("/sbin/vgextend ${${pv_array}[${pv_name}][vg]} ${pv_name}"),
                ifvarclass => and(canonify("lvm_pv_${pv_name}"), not(canonify("lvm_pv_${pv_name}_vg_")), canonify("lvm_vg_${${pv_array}[${pv_name}][vg]}")),
                   classes => if_repaired_two("lvm_pv_${pv_name}_vg_", "lvm_pv_${pv_name}_vg_${${pv_array}[${pv_name}][vg]}");
  reports:
      "LVM PV '${pv_name}' already in use with VG '${${pv_array}[${pv_name}][vg]}'. Please set free manually (vgremove/vgreduce)."
                ifvarclass => and(canonify("lvm_pv_${pv_name}"), canonify("lvm_pv_${pv_name}_vg_"), not(canonify("lvm_pv_${pv_name}_vg_${${pv_array}[${pv_name}][vg]}")));
}  
bundle agent lvm_lv_set (lv_array) {
  vars:
      "lv_name" slist => getindices("${lv_array}"),
              comment => "List of names LVM Logical Volumes";

  methods:
      "lvcreate"  usebundle => command_execution("/sbin/lvcreate -L ${${lv_array}[${lv_name}][size]}B -n ${lv_name} ${${lv_array}[${lv_name}][vg]}"),
                 ifvarclass => and(not(canonify("lvm_lv_${${lv_array}[${lv_name}][vg]}/${lv_name}")), canonify("lvm_vg_${${lv_array}[${lv_name}][vg]}")),
                    classes => if_repaired_two("lvm_lv_${${lv_array}[${lv_name}][vg]}/${lv_name}","lvm_lv_${${lv_array}[${lv_name}][vg]}/${lv_name}_size_${${lv_array}[${lv_name}][size]}");
      "lvresize"  usebundle => command_execution("/sbin/lvresize -L ${${lv_array}[${lv_name}][size]}B /dev/mapper/${${lv_array}[${lv_name}][vg]}-${lv_name} "),
                 ifvarclass => and(canonify("lvm_lv_${${lv_array}[${lv_name}][vg]}/${lv_name}"), not(canonify("lvm_lv_${${lv_array}[${lv_name}][vg]}/${lv_name}_size_${${lv_array}[${lv_name}][size]}")), isgreaterthan("${${lv_array}[${lv_name}][size]}","${filesystems.filesystems[lv][${${lv_array}[${lv_name}][vg]}/${lv_name}][size]}")),
                     handle => canonify("lvresize_/dev/mapper/${${lv_array}[${lv_name}][vg]}-${lv_name}"),
                    classes => if_repaired("lvm_lv_${${lv_array}[${lv_name}][vg]}/${lv_name}_size_${${lv_array}[${lv_name}][size]}");
  reports:
      "Size promised for LV ${${lv_array}[${lv_name}][vg]}/${lv_name} is lower than current. Must be done manually (umount,resize2fs,lvresize,resize2fs)."
                 ifvarclass => and(canonify("lvm_lv_${${lv_array}[${lv_name}][vg]}/${lv_name}"), not(canonify("lvm_lv_${${lv_array}[${lv_name}][vg]}/${lv_name}_size_${${lv_array}[${lv_name}][size]}")), islessthan("${${lv_array}[${lv_name}][size]}","${filesystems.filesystems[lv][${${lv_array}[${lv_name}][vg]}/${lv_name}][size]}"));
}  
bundle agent fs_set (fs_array) {
  vars:
      "fs_name" slist => getindices("${fs_array}"),
              comment => "List of names for filesystems";

  methods:
      "mkfs"      usebundle => command_execution("/sbin/mkfs -q -t ${${fs_array}[${fs_name}][type]} ${${fs_array}[${fs_name}][create_options]} ${fs_name}"),
                 ifvarclass => not(canonify("fs_${fs_name}")),
                     handle => canonify("mkfs_${fs_name}"),
                    classes => if_repaired_two("fs_${fs_name}","fs_${fs_name}_type_${${fs_array}[${fs_name}][type]}");
      "resize2fs" usebundle => command_execution("/sbin/resize2fs ${fs_name}"),
                 depends_on => { canonify("lvresize_${fs_name}") };
                 # !!! Sauf si il y a eu un mkfs !!!
      "tune2fs"   usebundle => command_execution("/sbin/tune2fs -i0 -c-1 ${fs_name}"),
                 depends_on => { canonify("mkfs_${fs_name}") };

  reports:
      "Filesystem already existing. Have te be removed manually."
            ifvarclass => and(canonify("fs_${fs_name}"), not(canonify("fs_${fs_name}_type_${${fs_array}[${fs_name}][type]}")));

}
bundle agent mount_set (mount_array) {
  vars:
      "mount_name" slist => getindices("${mount_array}"),
                 comment => "List of names for mount points";
  classes:
      "mount_${mount_name}_with_fstab" expression => regcmp('^1$',"${${mount_array}[${mount_name}][fstab]}");

  methods:
      "fstab_update_line"    usebundle => fstab_update_line("${mount_name}", "${mount_array}[${mount_name}]"),
                     ifvarclass => and(not(canonify("fstab_${mount_name}_device_${${mount_array}[${mount_name}][device]}_type_${${mount_array}[${mount_name}][type]}_options_${${mount_array}[${mount_name}][options]}_dump_${${mount_array}[${mount_name}][dump]}_pass_${${mount_array}[${mount_name}][pass]}")), canonify("mount_${mount_name}_with_fstab")),
                         handle => canonify("fstab_update_line_${mount_name}");

      "mount" usebundle => command_execution("/bin/mount -t ${${mount_array}[${mount_name}][type]} -o ${${mount_array}[${mount_name}][options]} ${${mount_array}[${mount_name}][device]} ${mount_name}"),
             ifvarclass => and(not(canonify("mounted_${mount_name}")), not(canonify("mount_${mount_name}_with_fstab")));
      "remount" usebundle => command_execution("/bin/mount -t ${${mount_array}[${mount_name}][type]} -o remount,${${mount_array}[${mount_name}][options]} ${${mount_array}[${mount_name}][device]} ${mount_name}"),
               ifvarclass => and(canonify("mounted_${mount_name}"), not(canonify("mounted_${mount_name}_device_${${mount_array}[${mount_name}][device]}_type_${${mount_array}[${mount_name}][type]}_options_${${mount_array}[${mount_name}][options]}_dump_${${mount_array}[${mount_name}][dump]}_pass_${${mount_array}[${mount_name}][pass]}")), not(canonify("mount_${mount_name}_with_fstab")));

      "mount_fstab" usebundle => command_execution("/bin/mount ${mount_name}"),
                   ifvarclass => not(canonify("mounted_${mount_name}")),
                   depends_on => { canonify("fstab_update_line_${mount_name}") };
      "remount_fstab" usebundle => command_execution("/bin/mount -o remount ${mount_name}"),
                     ifvarclass => canonify("mounted_${mount_name}"),
                     depends_on => { canonify("fstab_update_line_${mount_name}") };
} 

# 60_services

 bundle agent newfs {
  vars: 
      "pv[/dev/vda][vg]"                       string => "tvg";
      "pv[/dev/vdb1][vg]"                       string => "tvg";
      "pv[/dev/vdb2][vg]"                       string => "t2vg";
      "lv[srv_lvt1][vg]"                      string => "tvg";
      "lv[srv_lvt1][size]"                       int => "6G";
      "fs[/dev/mapper/tvg-srv_lvt1][type]"           string => "ext4";
      "fs[/dev/mapper/tvg-srv_lvt1][create_options]" string => '-m 1';
      "mt[/srv/lvt1][device]"                 string => "/dev/mapper/tvg-srv_lvt1";
      "mt[/srv/lvt1][type]"                   string => "ext4";
      "mt[/srv/lvt1][options]"                string => "nodev,noexec,nosuid";
      "mt[/srv/lvt1][dump]"                      int => "0";
      "mt[/srv/lvt1][pass]"                      int => "2";
      "mt[/srv/lvt1][fstab]"                     int => "1";
      "lv[srv_lvt2][vg]"                      string => "t2vg";
      "lv[srv_lvt2][size]"                       int => "4G";
      "fs[/dev/mapper/t2vg-srv_lvt2][type]"           string => "ext4";
      "fs[/dev/mapper/t2vg-srv_lvt2][create_options]" string => '-m 1';
      "mt[/srv/lvt2][device]"                 string => "/dev/mapper/t2vg-srv_lvt2";
      "mt[/srv/lvt2][type]"                   string => "ext4";
      "mt[/srv/lvt2][options]"                string => "nodev,noexec";
      "mt[/srv/lvt2][dump]"                      int => "0";
      "mt[/srv/lvt2][pass]"                      int => "2";
      "mt[/srv/lvt2][fstab]"                     int => "1";
      "lv[srv_lvt3][vg]"                      string => "tvg";
      "lv[srv_lvt3][size]"                       int => "2G";
      "fs[/dev/mapper/tvg-srv_lvt3][type]"           string => "ext3";
      "fs[/dev/mapper/tvg-srv_lvt3][create_options]" string => '-m 1';
      "mt[/srv/lvt3][device]"                 string => "/dev/mapper/tvg-srv_lvt3";
      "mt[/srv/lvt3][type]"                   string => "ext4";
      "mt[/srv/lvt3][options]"                string => "noatime";
      "mt[/srv/lvt3][dump]"                      int => "0";
      "mt[/srv/lvt3][pass]"                      int => "2";
      "mt[/srv/lvt3][fstab]"                     int => "1";
     
  methods:
      "configure_pv" usebundle => lvm_pv_set("newfs.pv");
      "configure_lv" usebundle => lvm_lv_set("newfs.lv");
      "configure_fs" usebundle => fs_set("newfs.fs");
      "configure_mt" usebundle => mount_set("newfs.mt");
}    

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 246 bytes
Desc: OpenPGP digital signature
URL: <http://www.rudder-project.org/pipermail/rudder-users/attachments/20140703/2f035f00/attachment.pgp>


More information about the rudder-users mailing list