背景
在openlava運維中經常需要自動化一些常規操作,比如增加用戶組以及組成員、刪除用戶組成員、刪除用戶組等。而openlava的配置文件需要手動修改,然后再通過badmin ?reconfig激活配置。因此開發腳本將手工操作自動化就很有必要。
通過將腳本中的UserGroup替換為HostGroup,就可以對主機組進行操作。
此腳本也適用于 LSF 用戶組管理;不過LSF支持通過bconf修改配置,不再需要badmin reconfig激活。
功能
下面的腳本就可以對openlava中的用戶組進行操作:
* 增加用戶組成員,如果組不存在則自動創建用戶組;
* 刪除用戶組成員,如果組內已沒有成員則自動刪除用戶組;
* 刪除用戶組
* 檢查用戶組是否包含成員;
參數
在使用之前需要設置以下參數:
LSF_PROFILE="/openlava/etc/openlava.sh"
GROUP_FILE="/openlava/etc/lsb.users"
LOG_FILE="/openlava/log/lavaug.log"
ADMIN="lsfadmin"
使用方法
1. 檢查用戶組是否包含成員
lavaug checkmember <group> <member>
返回碼:0 包含 非0 不包含
2. 增加用戶組成員
lavaug addmember <group> <member>
返回碼:0 添加成功 非0 添加失敗
3. 刪除用戶組成員
lavaug rmmember <group> <member>
返回碼:0 刪除成功 非0?刪除失敗
4. 刪除用戶組
lavaug rmgroup?<group>?
返回碼:0 刪除成功 非0?刪除失敗
注:腳本會將操作以及錯誤寫入日志文件,方便審記和排查錯誤。
源代碼
#!/bin/bashlogger() {echo `date` $@ >> $LOG_FILE
}# 判斷配置文件中組名是否存在
is_group_defined() {local group=$1local file=$2# 使用 awk 查找在 "Begin UserGroup" 和 "End UserGroup" 之間的組名local group=$(awk -v group="$group" '/Begin UserGroup/,/End UserGroup/ { if ($1 == group) print $1 }' "$file")if [ -n "$group" ]; thenreturn 0elsereturn 1fi
}# 判斷配置文件中的組中是否包含指定成員
is_member_in_group() {local group=$1local member=$2local file=$3# 使用 awk 查找在 "Begin UserGroup" 和 "End UserGroup" 之間的組名用用戶名local result=$(awk -v group="$group" -v member="$member" '/Begin UserGroup/,/End UserGroup/ {if ($1 == group && index($0, member)) {print member}}' "$file")if [ -n "$result" ]; thenreturn 0elsereturn 1fi
}# 在配置文件中添加新成員到組中
add_group_member() {local group=$1local member=$2local file=$3# 創建臨時文件local tmp_file=$(mktemp)# 使用 awk 處理文件,找到組名并添加新成員,其他行保持不變,輸出到臨時文件awk -v group="$group" -v member="$member" '/Begin UserGroup/,/End UserGroup/ {# 在組名后的括號內添加新成員,確保不重復添加if ($1 == group && !index($0, member)) {sub(/)/, " " member ")")}}{ print }' "$file" > "$tmp_file"# 替換原文件mv "$tmp_file" "$file"chown "$ADMIN":"$ADMIN" "$file"is_member_in_group "$group" "$member" "$file"return $?
}# 在配置文件中刪除組成員, 成員列表為空時刪除組
rm_group_member() {local group=$1local member=$2local file=$3# 創建臨時文件local tmp_file=$(mktemp)# 使用 awk 處理文件,找到組名并刪除成員,其他行保持不變,輸出到臨時文件awk -v group="$group" -v member="$member" '/Begin UserGroup/,/End UserGroup/ {# 在成員列表中刪除指定成員, 若成員為空則刪除組if ($1 == group && index($0, member)) {gsub(" *" member " *", " ")if ($2 == "(" && $3 == ")") {next}}}{ print }' "$file" > "$tmp_file"# 替換原文件mv "$tmp_file" "$file"chown "$ADMIN":"$ADMIN" "$file"if ! is_member_in_group "$group" "$member" "$file" ; thenreturn 0elsereturn 1fi
}# 在配置文件中創建新組并添加新成員
create_group() {local group=$1local member=$2local file=$3# 創建臨時文件local tmp_file=$(mktemp) # 使用 awk 處理文件,在 "End UserGroup" 前添加新組,如果 "Begin UserGroup" 和 "End UserGroup" 存在awk -v group="$group" -v member="$member" 'BEGIN { group_added = 0 }/Begin UserGroup/ {in_group = 1}/End UserGroup/ {if (!group_added) {print group " (" member ")"group_added = 1}in_group = 0}in_group { print }!in_group { print }' "$file" > "$tmp_file"# 如果沒有找到 "Begin UserGroup" 和 "End UserGroup",則直接在文件末尾添加if ! is_group_defined "$group" "$tmp_file"; thenecho -e "\nBegin UserGroup\n"$group" ("$member")\nEnd UserGroup" >> "$tmp_file"fi# 替換原文件mv "$tmp_file" "$file"chown "$ADMIN":"$ADMIN" "$file"is_member_in_group "$group" "$member" "$file"return $?
}# 在配置文件中刪除組
rm_group() {local group=$1local file=$2# 創建臨時文件local tmp_file=$(mktemp)# 使用 awk 處理文件,找到組名并添加新成員,其他行保持不變,輸出到臨時文件awk -v group="$group" '/Begin UserGroup/,/End UserGroup/ {# 在組名后的列表中刪除成員if ($1 == group) {next}}{ print }' "$file" > "$tmp_file"# 替換原文件mv "$tmp_file" "$file"chown "$ADMIN":"$ADMIN" "$file"if ! is_group_defined "$group" "$file"; thenreturn 0elsereturn 1fi
}# 檢查系統內組是否存在
group_exist() {local group=$1bugroup $group > /dev/null 2>>$LOG_FILEreturn $?
}# 檢查系統內組是否存在
group_missing() {local group=$1bugroup $group > /dev/null 2>>$LOG_FILEif [ $? -eq 0 ]; thenreturn 1elsereturn 0fi
}# 檢查系統內用戶是否存在于指定組
member_exist() {local group=$1local member=$2bugroup $group 2>>$LOG_FILE| grep -w $member >/dev/nullreturn $?
}# 檢查系統內用戶是否存在于指定組
member_missing() {local group=$1local member=$2bugroup $group 2>>$LOG_FILE| grep -w $member >/dev/nullif [ $? -eq 0 ]; thenreturn 1elsereturn 0fi
}# 激活配置文件中的變更
activate_change() {echo -e "y\nn\n" | badmin reconfig >> $LOG_FILE 2>&1return $?
}run() {# 檢查 LSF 環境變量是否已加載if [ ! -f "$LSF_PROFILE" ]; thenlogger [ERRO] "LSF_PROFILE not found: $LSF_PROFILE"exit 1fi# 檢查用戶文件是否存在if [ ! -f "$GROUP_FILE" ]; thenlogger [ERROR] "User file not found: $GROUP_FILE"exit 1fi# 加載 LSF 環境變量. $LSF_PROFILEgroupfile="$GROUP_FILE"action="$1"group="$2"member="$3"logger [INFO] request: $@case "$action" in"checkmember")member_exist "$group" "$member"ret=$?[ $ret -eq 0 ] && logger [INFO] "Found $member in $group" || logger [WARN] "Not found $member in $group"exit $ret;;"addmember")# 檢查組名是否在指定范圍內if is_group_defined "$group" "$groupfile"; thenif is_member_in_group "$group" "$member" "$groupfile"; thenmember_exist "$group" "$member"if [ $? -eq 0 ]; thenlogger [INFO] $member already in group $groupexit 0elseactivate_change && sleep 5 && member_exist "$group" "$member"ret=$?[ $ret -eq 0 ] && logger [INFO] "Add $member into $group succeeded" || logger [WARN] "Add $member into $group failed"exit $retfielse# 組名存在,但成員不存在,添加新成員add_group_member "$group" "$member" "$groupfile" && activate_change && sleep 5 && member_exist "$group" "$member"ret=$?[ $ret -eq 0 ] && logger [INFO] "Add $member into $group succeeded" || logger [WARN] "Add $member into $group failed"exit $retfielse# 組名不存在,創建新組并添加新成員create_group "$group" "$member" "$groupfile" && activate_change && sleep 5 && member_exist "$group" "$member"ret=$?[ $ret -eq 0 ] && logger [INFO] "Add $member into $group succeeded" || logger [WARN] "Add $member into $group failed"exit $retfi;;"rmmember")# 檢查組名是否在指定范圍內if is_group_defined "$group" "$groupfile"; thenif is_member_in_group "$group" "$member" "$groupfile"; thenmember_exist "$group" "$member"if [ $? -eq 0 ]; thenrm_group_member "$group" "$member" "$groupfile" && activate_change && sleep 5 && member_missing "$group" "$member"ret=$?[ $ret -eq 0 ] && logger [INFO] "Remove $member from $group succeeded" || logger [WARN] "Remove $member from $group failed"exit $retelse# 組名存在,但成員不存在logger [INFO] "$member is not in $group"exit 0fielse# 組名存在,但成員不存在logger [WARN] "Not found $group"exit 0fielse# 組名不存在logger [WARN] "Not found $group"exit 0fi;;"rmgroup")if is_group_defined "$group" "$groupfile"; thenrm_group "$group" "$groupfile" && activate_change && sleep 5 && group_missing "$group"ret=$?[ $ret -eq 0 ] && logger [INFO] "Remove $group succeeded" || logger [WARN] "Remove $group failed"exit $retelif group_exist "$group"; then# 文件中沒有組名,但系統中還有activate_change && sleep 5 && group_missing "$group"ret=$?[ $ret -eq 0 ] && logger [INFO] "Remove $group succeeded" || logger [WARN] "Remove $group failed"exit $retelselogger [WARN] "Not found $group"exit 0fi;;*)logger [WARN] "Invalid action: $action"exit 1;;esac
}##########################
#### Main Entry Start ####
########################### Please modify the LSF_PROFILE, GROUP_FILE, ADMIN accordingly
LSF_PROFILE="/openlava/etc/openlava.sh"
GROUP_FILE="/openlava/etc/lsb.users"
LOG_FILE="/openlava/log/lavaug.log"
ADMIN="lsfadmin"run $@