背景
在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"
使用方法
- 检查用户组是否包含成员
lavaug checkmember <group> <member>
返回码:0 包含 非0 不包含
- 增加用户组成员
lavaug addmember <group> <member>
返回码:0 添加成功 非0 添加失败
- 删除用户组成员
lavaug rmmember <group> <member>
返回码:0 删除成功 非0 删除失败
- 删除用户组
lavaug rmgroup <group>
返回码:0 删除成功 非0 删除失败
注:脚本会将操作以及错误写入日志文件,方便审记和排查错误。
源代码
bash
#!/bin/bash
logger() {
echo `date` $@ >> $LOG_FILE
}
# 判断配置文件中组名是否存在
is_group_defined() {
local group=$1
local 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" ]; then
return 0
else
return 1
fi
}
# 判断配置文件中的组中是否包含指定成员
is_member_in_group() {
local group=$1
local member=$2
local 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" ]; then
return 0
else
return 1
fi
}
# 在配置文件中添加新成员到组中
add_group_member() {
local group=$1
local member=$2
local 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=$1
local member=$2
local 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" ; then
return 0
else
return 1
fi
}
# 在配置文件中创建新组并添加新成员
create_group() {
local group=$1
local member=$2
local 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"; then
echo -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=$1
local 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"; then
return 0
else
return 1
fi
}
# 检查系统内组是否存在
group_exist() {
local group=$1
bugroup $group > /dev/null 2>>$LOG_FILE
return $?
}
# 检查系统内组是否存在
group_missing() {
local group=$1
bugroup $group > /dev/null 2>>$LOG_FILE
if [ $? -eq 0 ]; then
return 1
else
return 0
fi
}
# 检查系统内用户是否存在于指定组
member_exist() {
local group=$1
local member=$2
bugroup $group 2>>$LOG_FILE| grep -w $member >/dev/null
return $?
}
# 检查系统内用户是否存在于指定组
member_missing() {
local group=$1
local member=$2
bugroup $group 2>>$LOG_FILE| grep -w $member >/dev/null
if [ $? -eq 0 ]; then
return 1
else
return 0
fi
}
# 激活配置文件中的变更
activate_change() {
echo -e "y\nn\n" | badmin reconfig >> $LOG_FILE 2>&1
return $?
}
run() {
# 检查 LSF 环境变量是否已加载
if [ ! -f "$LSF_PROFILE" ]; then
logger [ERRO] "LSF_PROFILE not found: $LSF_PROFILE"
exit 1
fi
# 检查用户文件是否存在
if [ ! -f "$GROUP_FILE" ]; then
logger [ERROR] "User file not found: $GROUP_FILE"
exit 1
fi
# 加载 LSF 环境变量
. $LSF_PROFILE
groupfile="$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"; then
if is_member_in_group "$group" "$member" "$groupfile"; then
member_exist "$group" "$member"
if [ $? -eq 0 ]; then
logger [INFO] $member already in group $group
exit 0
else
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 $ret
fi
else
# 组名存在,但成员不存在,添加新成员
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 $ret
fi
else
# 组名不存在,创建新组并添加新成员
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 $ret
fi
;;
"rmmember")
# 检查组名是否在指定范围内
if is_group_defined "$group" "$groupfile"; then
if is_member_in_group "$group" "$member" "$groupfile"; then
member_exist "$group" "$member"
if [ $? -eq 0 ]; then
rm_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 $ret
else
# 组名存在,但成员不存在
logger [INFO] "$member is not in $group"
exit 0
fi
else
# 组名存在,但成员不存在
logger [WARN] "Not found $group"
exit 0
fi
else
# 组名不存在
logger [WARN] "Not found $group"
exit 0
fi
;;
"rmgroup")
if is_group_defined "$group" "$groupfile"; then
rm_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 $ret
elif 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 $ret
else
logger [WARN] "Not found $group"
exit 0
fi
;;
*)
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 $@