openlava/LSF 用户组管理脚本

背景

在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 $@

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7513.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

矩阵的秩在机器学习中具有广泛的应用

矩阵的秩在机器学习中具有广泛的应用&#xff0c;主要体现在以下几个方面&#xff1a; 一、数据降维与特征提取 主成分分析&#xff08;PCA&#xff09;&#xff1a; PCA是一种常用的数据降维技术&#xff0c;它通过寻找数据中的主成分&#xff08;即最大方差方向&#xff09…

Windows Defender添加排除项无权限的解决方法

目录 起因Windows Defender添加排除项无权限通过管理员终端添加排除项管理员身份运行打开PowerShell添加/移除排除项的命令 起因 博主在打软件补丁时&#xff0c;遇到 Windows Defender 一直拦截并删除文件&#xff0c;而在 Windows Defender 中无权限访问排除项。尝试通过管理…

IDEA工具下载、配置和Tomcat配置

1. IDEA工具下载、配置 1.1. IDEA工具下载 1.1.1. 下载方式一 官方地址下载 1.1.2. 下载方式二 官方地址下载&#xff1a;https://www.jetbrains.com/idea/ 1.1.3. 注册账户 官网地址&#xff1a;https://account.jetbrains.com/login 1.1.4. JetBrains官方账号注册…

计算机网络之应用层

本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 05 应用层 在网上看到其他人做了相关笔记&#xff0c;就不再多余写了&#xff0c;直接参考着学习吧。 王道考研 计算机网络笔记 第六章&#xff1a;应用层_王道考研 应用层 笔记-CSDN博客 DNS&#x…

微信小程序date picker的一些说明

微信小程序的picker是一个功能强大的组件&#xff0c;它可以是一个普通选择器&#xff0c;也可以是多项选择器&#xff0c;也可以是时间、日期、省市区选择器。 官方文档在这里 这里讲一下date picker的用法。 <view class"section"><view class"se…

Pyecharts图表交互功能提升

在数据可视化中&#xff0c;交互功能可以极大地提升用户体验&#xff0c;让用户能够更加深入地探索数据。Pyecharts 提供了多种强大的交互功能&#xff0c;本篇将重点介绍如何使用缩略轴组件、配置图例交互&#xff0c;让我们的数据可视化作品更加生动有趣。 一、缩略轴组件使…

奇怪的单词(快速扩张200个单词)

这是一些非常奇怪的单词&#xff1a; screw n.螺丝&#xff1b;螺丝钉 screwdriver n.起子&#xff0c;螺丝刀&#xff0c;改锥 copulation n.连接 copulate a.配合的 bonk n.撞击&#xff1b;猛击 v.轻击&#xff1b;碰撞ebony n.黑檀couple n.夫妇blonde n.金发女郎intimacy…

Ubuntu20.04 深度学习环境配置(持续完善)

文章目录 常用的一些命令安装 Anaconda创建conda虚拟环境查看虚拟环境大小 安装显卡驱动安装CUDA安装cuDNN官方仓库安装 cuDNN安装 cuDNN 库验证 cuDNN 安装确认 CUDA 和 cuDNN 是否匹配&#xff1a; TensorRT下载 TensorRT安装 TensorRT 本地仓库配置 GPG 签名密钥安装 Tensor…

Android多语言开发自动化生成工具

在做 Android 开发的过程中&#xff0c;经常会遇到多语言开发的场景&#xff0c;尤其在车载项目中&#xff0c;多语言开发更为常见。对应多语言开发&#xff0c;通常都是在中文版本的基础上开发其他国家语言&#xff0c;这里我们会拿到中-外语言对照表&#xff0c;这里的工作难…

数据结构——堆(C语言)

基本概念&#xff1a; 1、完全二叉树&#xff1a;若二叉树的深度为h&#xff0c;则除第h层外&#xff0c;其他层的结点全部达到最大值&#xff0c;且第h层的所有结点都集中在左子树。 2、满二叉树&#xff1a;满二叉树是一种特殊的的完全二叉树&#xff0c;所有层的结点都是最…

const的用法

文章目录 一、C和C中const修饰变量的区别二、const和一级指针的结合const修饰的量常出现的错误是:const和一级指针的结合总结&#xff1a;const和指针的类型转换公式 三、const和二级指针的结合 一、C和C中const修饰变量的区别 C中&#xff1a;const必须初始化&#xff0c;叫常…

机器学习-线性回归(参数估计之经验风险最小化)

给定一组包含 &#x1d441; 个训练样本的训练集 我们希望能够 学习一个最优的线性回归的模型参数 &#x1d498; 现在我们来介绍线性回归的一种模型参数估计方法&#xff1a;经验风险最小化。 我们前面说过&#xff0c;对于标签 &#x1d466; 和模型输出都为连续的实数值&…

appium自动化环境搭建

一、appium介绍 appium介绍 appium是一个开源工具、支持跨平台、用于自动化ios、安卓手机和windows桌面平台上面的原生、移动web和混合应用&#xff0c;支持多种编程语言(python&#xff0c;java&#xff0c;Ruby&#xff0c;Javascript、PHP等) 原生应用和混合应用&#xf…

视频多模态模型——视频版ViT

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细解读多模态论文《ViViT: A Video Vision Transformer》&#xff0c;2021由google 提出用于视频处理的视觉 Transformer 模型&#xff0c;在视频多模态领域有…

使用Cline+deepseek实现VsCode自动化编程

不知道大家有没有听说过cursor这个工具&#xff0c;类似于AIVsCode的结合体&#xff0c;只要绑定chatgpt、claude等大模型API&#xff0c;就可以实现对话式自助编程&#xff0c;简单闲聊几句便可开发一个软件应用。 但cursor受限于外网&#xff0c;国内用户玩不了&#xff0c;…

【Linux】Linux编译器-g++、gcc、动静态库

只要积极创造&#xff0c;机遇无时不有&#xff1b;只要善于探索&#xff0c;真理无处不在。&#x1f493;&#x1f493;&#x1f493; 目录 ✨说在前面 &#x1f34b;知识点一&#xff1a;Linux编译器-g、gcc •&#x1f330;1. 背景知识 •&#x1f330;2. gcc如何完成 •…

Spring整合Mybatis、junit纯注解

如何创建一个Spring项目 错误问题 不知道什么原因&#xff0c;大概是依赖版本不兼容、java版本不对的问题&#xff0c;折磨了好久就是搞不成。 主要原因看pom.xml配置 pom.xml配置 java版本 由于是跟着22年黑马视频做的&#xff0c;java版本换成了jdk-11&#xff0c;用21以…

【架构面试】二、消息队列和MySQL和Redis

MQ MQ消息中间件 问题引出与MQ作用 常见面试问题&#xff1a;面试官常针对项目中使用MQ技术的候选人提问&#xff0c;如如何确保消息不丢失&#xff0c;该问题可考察候选人技术能力。MQ应用场景及作用&#xff1a;以京东系统下单扣减京豆为例&#xff0c;MQ用于交易服和京豆服…

MATLAB提供的颜色映射表colormap——伪彩色

图像处理领域的一个习惯&#xff1a;不是真实的颜色&#xff0c;一般用伪彩色。一是说明不是物体本身的颜色&#xff0c;二是彩色更容易分辨。 MATLAB陆续提供了16种颜色映射表colormap。 之前的都很丑&#xff0c;近5年新增的4种还可以。总的说来还是丑。 这是一种鸟的名字。…

案例研究丨浪潮云洲通过DataEase推进多维度数据可视化建设

浪潮云洲工业互联网有限公司&#xff08;以下简称为“浪潮云洲”&#xff09;成立于2018年&#xff0c;定位于工业数字基础设施建设商、具有国际影响力的工业互联网平台运营商、生产性互联网头部服务商。截至目前&#xff0c;浪潮云洲工业互联网平台连续五年入选跨行业跨领域工…