ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

90DaysOfDevOps 之 Bash 脚本自动化:从零编写可复用、可执行的 Shell 任务脚本

90DaysOfDevOps 之 Bash 脚本自动化:从零编写可复用、可执行的 Shell 任务脚本 文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载本篇技术指南以 90DaysOfDevOps 挑战第 19 天的核心内容为主线系统讲解如何用 BashBourne Again Shell编写自动化脚本从 shebang、注释、执行权限等基础到变量、用户输入、条件判断与文件检测最后以一个自动创建 Linux 新用户的完整入职自动化案例收尾。读完本文你将掌握编写、调试和运行可复用 Bash 脚本的完整方法论并能直接对照 create-user.sh 等仓库源码验证每一步实现。为什么在 DevOps 中用 Bash 做自动化BASH 是BourneAgainShell 的缩写它是今天的主角在 90 天学习路线中后续章节还会介绍 ZSH 等其他 Shell。Shell 脚本几乎可以像一门编程语言那样撑起 7 天的专题学习但它的真正价值在于与周边自动化工具协同工作把重复性、临时性ad-hoc任务一键化。企业里很多关键业务都依赖复杂的 Shell 脚本但这不该成为我们学习它的唯一理由——更好的方式是让脚本配合你的自动化体系而不是成为脆弱的核心依赖。一个本系列前文已经出现过的例子用 VAGRANTFILE 创建 Linux 虚拟机完全可以用一个简单的 Bash 脚本把它包装起来每周一早晨自动删除并重建虚拟机从而每周都拿到一份全新的 Linux 环境同时把需要的软件栈一并安装进去全程只需一个脚本。另一个趋势是动手写脚本的题目在各类面试中出现的频率越来越高。说明以下示例中的练习脚本如 90DaysOfDevOps.sh、create_user.sh建议在实验环境或虚拟机中创建运行仓库目录本身是只读的仅供阅读参考。准备工作文本编辑器与第一个 Bash 脚本与 90 天系列中的多数主题一样掌握 Bash 的唯一途径是动手实践。首先需要准备一个文本编辑器——第 17 天已经介绍过最常见的两种编辑器及其基本用法如 nano、vim你可以任选其一。创建并编辑第一个脚本touch 90DaysOfDevOps.sh nano 90DaysOfDevOps.shnano会打开一个空白的新脚本文件供编辑。shebang脚本第一行的固定写法所有 Bash 脚本的第一行都形如#!/usr/bin/bash这一行称为 shebang它指明 bash 二进制的路径。不过不同发行版的 bash 路径可能不同建议在终端里确认which bash # Ubuntu 等多数发行版 whereis bash # 非 Ubuntu 系统的备选命令你还会在已有脚本中见到其他合法写法#!/bin/bash#!/usr/bin/env bash通过 env 在 PATH 中查找 bash可移植性更好注释与 figlet 开头装饰脚本的第二行开始推荐先写注释说明脚本用途与作者信息。用#即可注释单行代码为后续命令提供描述——注释越清晰脚本越容易被他人以及未来的自己理解与共享。原文档中还介绍了一个技巧使用此前 Linux 章节安装过的figlet程序生成 ASCII 艺术字作为脚本开头的封面配合注释提升脚本的可读性。效果见下图脚本内容同时包含 shebang、ASCII 艺术字与说明注释用简单命令块测试脚本第 15 天 中讲过的 Linux 命令都可以直接写进脚本。先加入一段最简单的代码mkdir 90DaysOfDevOps cd 90DaysOfDevOps touch Day19 ls保存并退出编辑器后直接运行./90DaysOfDevOps.sh会得到Permission denied权限不足错误。用ls -al检查文件权限可以看到该文件没有可执行权限。chmod赋予脚本执行权限用chmod x添加执行权限chmod x 90DaysOfDevOps.sh再次ls -al权限位中会出现x表示文件现在可以执行了。再次运行./90DaysOfDevOps.sh脚本依次完成了创建新目录 → 进入该目录 → 创建新文件。执行结果如下图所示虽然基础但你已经能看到脚本如何串联多个命令、调用其他工具从而把手工步骤变成自动化流程。变量、用户输入与条件判断本部分大量内容与学习 Golang 时的概念呼应但值得在 Bash 语境下再深入一遍。变量一处定义、全局生效变量允许我们把脚本中反复出现的某个值定义一次。在脚本的空白行中直接赋值即可challenge90DaysOfDevOps此后代码中凡是使用$challenge的地方都会引用该变量的值只要修改变量定义整个脚本中的引用都会同步更新。运行脚本后即可看到打印出的赋值内容。read用用户输入给变量赋值除了写死的值还可以用read让用户输入并赋值给变量echo Enter your name read name这样用户输入的内容就成为变量$name可在后续代码中继续使用。if / elif / else根据完成天数给出反馈假设我们要统计挑战参与者各自完成了多少天可以用if、elif、else条件结构实现。原文档给出的完整示例脚本如下#!/bin/bash # ___ ___ ____ ___ __ ____ ___ # / _ \ / _ \| _ \ __ _ _ _ ___ / _ \ / _| _ \ _____ __/ _ \ _ __ ___ #| (_) | | | | | | |/ _ | | | / __| | | | |_| | | |/ _ \ \ / / | | | _ \/ __| # \__, | |_| | |_| | (_| | |_| \__ \ |_| | _| |_| | | __/\ V /| |_| | |_) \__ \ # /_/ \___/|____/ \__,_|\__, |___/\___/|_| |____/ \___| \_/ \___/| .__/|___/ # |___/ |_| # # This script is to demonstrate bash scripting! # Variables to be defined ChallengeName#90DaysOfDevOps TotalDays90 # User Input echo Enter Your Name read name echo Welcome $name to $ChallengeName echo How Many Days of the $ChallengeName challenge have you completed? read DaysCompleted if [ $DaysCompleted -eq 90 ] then echo You have finished, well done elif [ $DaysCompleted -lt 90 ] then echo Keep going you are doing great else echo You have entered the wrong amount of days fi注意脚本中$DaysCompleted与 90 的比较条件分支决定输出哪条提示信息。数值比较运算符[ ... ]测试中使用-eq这类运算符对两个值进行比较各运算符含义如下运算符含义返回 TRUE 的条件-eq等于两个值相等-ne不等于两个值不相等-gt大于第一个值大于第二个值-ge大于等于第一个值大于或等于第二个值-lt小于第一个值小于第二个值-le小于等于第一个值小于或等于第二个值文件条件探测文件与目录状态Bash 还可以在条件中判断文件/目录的属性常见文件条件如下条件含义-d filefile 是目录时返回 TRUE-e filefile 存在时返回 TRUE-f file给定字符串是一个文件时返回 TRUE-g file文件上设置了组 IDgroup id时返回 TRUE-r file文件可读时返回 TRUE-s file文件大小非零时返回 TRUE示例判断一个文件是否存在并输出对应信息FILE90DaysOfDevOps.txt if [ -f $FILE ] then echo $FILE is a file else echo $FILE is not a file fi只要该文件还存在于当前目录就会打印第一条 echo如果删除该文件则打印第二条。这类条件判断可用于在系统中快速定位特定文件节省手工查找的时间。实战案例用 Bash 脚本自动化新用户入职场景与需求假设公司叫 90DaysOfDevOps业务已运行一段时间接下来几周要把团队从 1 人扩展到更多人。目前只有你一个人掌握入职onboarding流程这是明显的瓶颈——用自动化脚本消除它。需求清单用户名可以作为命令行参数传入用该命令行参数创建对应用户密码可以作为命令行参数传入为用户设置该密码显示账号创建成功的提示消息。创建脚本骨架touch create_user.sh chmod x create_user.sh nano create_user.sh先touch创建文件再用chmod x赋予执行权限避免后续每次运行都要处理权限问题最后用nano编辑内容。需求 1命令行参数回显Bash 中$1表示命令行传入的第一个参数。先实现用户名可作为命令行参数传入#! /usr/bin/bash #A user can be passed in as a command line argument echo $1保存后运行./create_user.sh Michael把 Michael 换成你的名字终端会回显该参数。脚本与运行效果如下需求 2用 useradd -m 创建用户创建用户使用useradd命令其中-m选项会在/home/username为用户创建家目录#! /usr/bin/bash #A user can be passed in as a command line argument echo $1 user account being created. #A user is created with the name of the command line argument sudo useradd -m $1警告如果不提供用户名脚本会报错因为变量$1是空的。创建后可以用以下命令确认账号已写入系统用户数据库awk -F: { print $1 } /etc/passwdawk以冒号为字段分隔符-F:提取并打印/etc/passwd每行的第一个字段用户名。需求 3用 chpasswd 设置密码密码也作为命令行参数传入$2即第二个参数。需要强调的是生产环境永远不要这样做这里只是为了在实验环境中逐条落实需求、理解机制#! /usr/bin/bash #A user can be passed in as a command line argument echo $1 user account being created. #A user is created with the name of the command line argument sudo useradd -m $1 #A password can be parsed as a command line argument. sudo chpasswd $1:$2chpasswd从标准输入读取用户名:密码格式并更新密码是 here-string将$1:$2作为其标准输入。用两个参数运行./create_user.sh 90DaysOfDevOps password脚本创建了用户并设置密码后手动切换到该用户并用whoami确认身份需求 4-5成功消息与交互式改进成功消息其实已经包含在脚本第一行echo $1 user account being created.中运行截图里也能看到90DaysOfDevOps user account being created的输出——它来自$1参数的测试输出。现在脚本已经能快速为 Linux 系统入职并配置新用户。但为了减少老员工逐条处理、再手动把用户名密码转交给新人的麻烦可以改用此前学过的read用户输入来捕获变量让流程更交互#! /usr/bin/bash echo What is your intended username? read username echo What is your password read password #A user can be passed in as a command line argument echo $username user account being created. #A user is created with the name of the command line argument sudo useradd -m $username #A password can be parsed as a command line argument. sudo chpasswd $username:$password运行时会依次询问用户名和密码并在最后输出新用户账号创建完成的提示。一个值得注意的改进点输入密码时密码会明文显示在终端上。可以用read的-s选项隐藏输入read -s password这样密码输入时不回显更符合安全习惯。仓库源码对照完整的 create-user.sh 实现仓库中实际存放的 create-user.sh 对上述练习脚本做了进一步加固用if [ -z ${1} ]判断命令行参数是否为空把交互式创建与参数式删除两个分支整合进同一个脚本#! /usr/bin/bash if [ -z ${1} ] then echo What is your intended username? read username echo What is your password read password #A user can be passed in as a command line argument echo $username user account being created. #A user is created with the name of command line argument sudo useradd -m $username #A password can be parsed in as a command line argument. sudo chpasswd $username:$password sleep 2 echo If you want to delete the user then pass del and username in command line argument. e.g: ./create-user.sh del username else sudo userdel -rf ${2} sleep 2 echo ${2} user account successfully deleted. exit 0 fi从源码结构可以看到两个细节-z ${1}是字符串为空测试不带参数运行脚本时走交互式创建分支带参数例如del时走删除分支删除分支使用sudo userdel -rf ${2}-r同时删除用户家目录-f强制删除并用${2}指定要删除的用户名最后输出删除成功消息并exit 0退出。这也对应了文中提到的手工清理方式实验结束后可用sudo userdel test_user删除测试用户。小结识别并自动化你的重复任务本文覆盖了 Bash 脚本自动化的核心闭环shebang 与执行权限 → 变量与用户输入 → 条件判断与文件检测 → 一个完整可落地的入职自动化脚本并对照仓库源码 create-user.sh 与 VAGRANTFILE 验证了从手工创建虚拟机/用户到脚本一键完成的演化路径。原文档作者还提到一个理念与其把精力花在维护复杂脚本上不如先审视那些每天、每周或每月都在重复的任务——第一个自动化选择往往就是 Bash 脚本等复杂度上升后再迁移到更专业的工具。例如作者曾用一个简单的 Bash 文件在本地借助 minikube 拉起 Kubernetes 集群并附带数据服务但该主题要在后续 Kubernetes 章节再展开这里不展开细讲。下一步可以进入 第 20 天 继续学习。赞分享文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载相关推荐90DaysOfDevOps 之 Day 19用 Bash 脚本自动化日常运维任务90DaysOfDevOps 之 Day 19用 Bash 脚本自动化日常运维任务 本篇指南来自开源项目 90DaysOfDevOps 2022 系列 ht文档/教程90DaysOfDevOps 之 Day 19用 Bash 脚本自动化日常任务从第一个脚本到用户管理实战90DaysOfDevOps 之 Day 19用 Bash 脚本自动化日常任务从第一个脚本到用户管理实战 本篇技术指南是 90DaysOfDevOps 学文档/教程90DaysOfDevOps用 Bash 脚本把重复运维任务自动化Day 19 实战90DaysOfDevOps用 Bash 脚本把重复运维任务自动化Day 19 实战 本篇技术指南源自 90DaysOfDevOps 学习路线第 19 天文档/教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表