[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