shell脚本进阶1——精读ansible+shell脚本

2023-11-03

一、脚本规划思路

  • 运维实施部署平台时,需要先对系统进行初始化,安装所有基础服务环境及依赖包,关闭防火墙和selinux等操作之后,才能开始正式部署第三方插件和微服务。
  • 那系统初始化具体是干什么的呢?这就包括设置防火墙、服务器免密、配置基础环境和yum源、时间同步等等。
  • 当服务器太多时,我们不可能一台台登录上去操作,这极为耗时,所以可以结合ansible来写脚本,选一台主控机即可完成所有操作。

脚本思路:

  • 第一步:确定主控机,其他机器作为受控端,把我们后面要写的ansible脚本放在主控机上进行操作。
  • 第二步:预想用户在使用脚本时的大概要操作哪些步骤。
    • 防火墙、免密登录、配置yum源等等,这么多步骤,我们是不是应该要分条目来进行?先干什么,再干什么,理个顺序出来。
    • 是不是得搞个对话框出来与用户交互,让用户输入主控机信息?若在脚本里把主控机信息写死,那换个部署环境就不能玩了,或者很麻烦需要修改主控机信息,这就只能算半自动化了,没达到目的。
  • 第三步:规划脚本整体框架。当执行脚本时,第一步应该是主控机先对自己做系统初始化,然后再对受控机做,等所有机器的基础环境都具备后,才能再做其他设置。
    1. 确定主控机系统初始化脚本。主控机初始化和受控机操作得分开,我们规划只在主控机上存放脚本,提供基础环境的服务包和源,尽量把第三方服务和微服务安装在受控机,做到层次分明。
    2. 那受控机的脚本要怎么做呢?可以结合ansbile来玩,让主控机对其操作,这就需要定义清单文件、默认变量文件、静态文件、jinja2模板文件、角色任务、playbook剧本,还可以定义需要修改的变量、handlers处理程序任务,最后调试时再根据业务实际情况修改ansible配置文件参数,比如多进程并发数、ssh第一次登录访问会检查key的设置参数,理清需要使用的模块等等。这都需要一点点去调试修改,无误后才能上线正式环境。
  • 第四步:细化脚本执行步骤。上面我们只是理了下脚本框架,那脚本具体要做什么步骤需要规划清楚。
    1. 脚本输出的字体需要考虑,美化用户使用观感,比如tput、printf、echo命令。
    2. 确定对话框效果,比如whiptail、dialog工具。
    3. 定义函数。可以将用户在交互的对话框页面选择的所有操作类目分别定义成一个个子函数,最后再搞个总函数对其引用,比如主控机系统初始化定义成第1个子函数,对受控机的操作定义成第2个子函数…,当用户选择操作类目时,主函数根据用户的选择类目执行对应子函数。那怎么才能让主函数精确的执行对应的子函数呢?可以使用If语句对用户选择的类目结果进行判断,也可以使用case语句根据选择类目结果直接匹配。
    4. 编写playbook剧本。playbook中的内容需尽量简化,什么意思?正常的一个playbook中可以定义任务名称、主机、变量、tasks任务。若playbook简短还行,像系统初始化这种需要操作很多东西的情况下,是需要用到很多个模块,搞多个任务的,一趟下来palybook是很冗长的,要避免这种情况,尽量简洁。
      • 可以把变量和tasks任务全部放在角色里,根据标签对角色进行操作。
      • 定义清单文件,填写受控主机信息。为什么只填受控机的呢?因为主控机是单独设计的脚本操作。
      • 编写角色任务,根据用户选择的菜单条目来写,一个角色对应一个条目。
      • 角色任务中会涉及到安装包、yum源、二进制文件等等,这种就可以当作静态文件。
    5. 确定受控机的yum源。再给受控机安装服务时,受控机的源要怎么配置?可以在主控机上安装一个nginx服务,把提前下载好的离线安装包塞进一个统一目录下,利用nginx将这个目录映射到服务器外部,以web页面的方式让受控机去挂载配置本地yum源。
  • 第五步:理清子函数条目。我们前面说,可以根据用户的选择条目来定义子函数。那用户在对话框菜单中能选择哪些条目?我们可以规划一下:
    1. 首先得有个菜单吧,可以把生成菜单的命令段定义成第1个子函数。
    2. 设置防火墙类目,将其命令段定义成第2个子函数。
    3. 服务器免密操作类目,定义成第3个子函数。
    4. 安装服务器依赖类目,定义成第4个子函数。
    5. 设置时间同步类目,定义成第5个子函数。
    6. 设置harbor仓库域名解析类目,定义成第6个子函数。
  • 第六步: 理清主控机初始化脚本步骤。
    1. 配置本地yum源仓库。
    2. 关闭防火墙以及SELINUX。刚开时部署服务时需要关闭,等最后调试完后在设置防火墙规则。
    3. 安装docker、docker-compose服务、ansible、python-pip,将docker设置为系统服务。
    4. 配置本机提供外部使用的yum仓库,供受控机使用为本地源。
    5. 主控机本机免密登录。
    6. 安装常用运维工具包。
    7. 配置pip的docker依赖。
    8. 配置环境变量。
    9. 最后就是优化脚本,包括脚本输出的显示内容、避免脚本是否会输出打印敏感信息。
  • 第七步:以上就是我们要写的ansible脚本整体规划,整个框架写完后,再一点点改进。

二、主控机shell脚本

  • 先把主控机系统初始化脚本写出来,再写对受控机的操作脚本。

2.1 脚本输出字体特效

1.定义字体输出特效,提高用户使用观感。每种颜色特效都定义成一个子函数,当我想知道用户选择的条目执行结果时,就可以再这个条目的命令段最后引用颜色函数。

set +e
set -o noglob
bold=$(tput bold)
underline=$(tput sgr 0 1)
reset=$(tput sgr0)
red=$(tput setaf 1)
green=$(tput setaf 2)
yellow=$(tput setaf 3)
blue=$(tput setaf 4)
magenta=$(tput setaf 5)
cyan=$(tput setaf 6)
white=$(tput setaf 7)
underline() {
    printf "${underline}${bold}%s${reset}\n" "$@"
}
h1() {
    printf "\n${underline}${bold}${cyan}%s${reset}\n" "$@"
}
h2() {
    printf "\n${underline}${bold}${white}%s${reset}\n" "$@"
}
debug() {
    printf "${white}%s${reset}\n" "$@"
}
info() {
    printf "${white}-> %s${reset}\n" "$@"
}
success() {
    printf "${bold}${green}✔ %s${reset}\n" "$@"
}
error() {
    printf "${red}✖ %s${reset}\n" "$@"
}
warn() {
    printf "${yellow}%s${reset}\n" "$@"
}
bold() {
    printf "${bold}%s${reset}\n" "$@"
}
note() {
    printf "\n${underline}${bold}${blue}Note:${reset} ${blue}%s${reset}\n" "$@"
}

2.定义数组,写要安装的运维工具包。

set -e
set +o noglob
item=1
base_dir=$(readlink -f "$(dirname "$0")")    ##定位出符号链接所指向的位置。
list=(
    bash-completion
    bind-utils
    chrony
    cifs-utils
    cockpit
    cockpit-dashboard
    createrepo
    dstat
    expect
    ftp
    haveged
    iotop
    lrzsz
    lsof
    net-tools
    nfs-utils
    openvpn
    rsync
    screen
    sysstat
    tcpdump
    telnet
    tree
    unzip
    vim
    wget
    zip
    traceroute
    jq
)

2.2 生成菜单栏对话框

基本了解:

  • 当执行脚本后,得设计成与用户交互的功能,提供一个菜单供用户输入主控机信息,可以使用whiptail来实现。
  • 让用户输入ip和输入密码的两段命令段逻辑相同,下面拿输入ip命令段做解析。

代码解读:

  1. 新手先从while循环内容看,里面的核心是两个whiptail语句和一个if判断语句,其他内容都是定义变量被whiptail语句引用,最后再输出了第2个whiptail语句结果,是主控机Ip,供后面使用。
  2. while循环是个死循环,当用户用户输入信息错误时应该再重新输出,而不是直接退出。
  3. 第一个whiptail语句是个表单输入对话框,让用户输入主控机ip,若返回结果不等于0则退出,若输出的内容为exit则退出。
  4. 第二个whiptail语句也是表单输入对话框,是让用户再次输入主控机ip,用于信息核对确认。
  5. 往下有个if判断,对第一个whiptail和第2个whiptail输出结果进行判断,若输入值为空,或两次输入内容不等都会退出脚本
  6. continue语句遇错跳过本次循环,执行后面的;break语句遇错直接退出本次循环,不再执行后面的。
  7. 最后再把第2次输入的结果定义成变量。

1.第一步,输入主控机ip。

local_address() {
    local address1=""
    local address2=""
    title_box="获取本机IP地址"
    while true; do
        reg_box="请输入本机本机IP地址:"
        address1=$(whiptail --title "${title_box}" --inputbox "${reg_box}" 8 78 3>&1 1>&2 2>&3)
        [ $? != 0 ] && exit
        [ "${address1,,}" == "exit" ] && exit
        reg2_box="请
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell脚本进阶1——精读ansible+shell脚本 的相关文章

  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • 如何使用 Ansible playbook 中的 service_facts 模块检查服务是否存在且未安装在服务器中?

    我用过service facts检查服务是否正在运行并启用 在某些服务器中 未安装特定的软件包 现在 我如何知道这个特定的软件包没有安装在该特定的服务器上service facts module 在 Ansible 剧本中 它显示以下错误
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • 如何阻止ubuntu在使用apt安装或更新软件包时弹出“Daemons using outdatedlibraries”? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我最近新安装了 Ubuntu 22 04 LTS 我发现每次使用 apt 安装或更新软件包时 它都会询问我有关Which servic
  • 本地主机中的 Ansible SSH 连接错误

    当我针对本地主机启动我的剧本时 出现此错误 TASK setup fatal 127 0 0 1 UNREACHABLE gt changed false msg SSH encountered an unknown error durin
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 将变量写入 Ansible 中的文件

    我通过 URI 模块提取 JSON 并希望将接收到的内容写入文件 我能够获取内容并将其输出到调试器 因此我知道已收到内容 但我不知道写入文件的最佳实践 来自的重要评论tmoschou https stackoverflow com user
  • 使用when条件来匹配输出寄存器中的字符串(Ansible)

    我无法在输出变量中搜索我用于 when 语句的指定字符串 下面的代码应该检查输出变量中的字符串 distribute list 但是当运行剧本时它会给出错误 fatal 192 168 3 252 FAILED gt failed true
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务
  • 我什么时候应该编写 Linux 内核模块?

    有些人出于某种原因想要将 Linux 中的代码从用户空间移动到内核空间 很多时候 原因似乎是代码应该具有特别高的优先级 或者只是 内核空间更快 这对我来说似乎很奇怪 我什么时候应该考虑编写内核模块 有一套标准吗 我怎样才能激励将代码保存在
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4

随机推荐

  • C语言标准库函数qsort( )——数据排序

    大家好 我是保护小周 本期为大家带来的是深度解剖C语言标准库函数 qsort qsort 函数他可以对任意类型的数据排序 博主会详细解释函数使用方法 以及使用快速排序的左右指针法模拟实现函数功能 这样的排序确定不来学习一下吗 目录 一 qs
  • Vue之动画的实现

    前言 当我们的UI界面显示出来后 需要和用户进行交互 即用户点击某个控件 比如是一个按钮 需要跳转到另一个界面的时候 如果直接跳转到另一个界面 功能是实现了 但是未免有些生硬 因为用户体验不是很好 这时就需要动画的润色了 添加一个好的转场动
  • 入门精通web前端:三大核心HTML5、CSS3 、JS必学

    WEB前端三大基础核心内容 HTML5 CSS3 和 JavaScript 对于前端的学习和提高 我的基本思路是这样的 首先 前端的三个最基本的东西 HTML5 CSS3 和 JavaScript ES6 是必须要学好的 这其中有很多很多的
  • matlab的运行环境,MatLab运行环境介绍.ppt

    MatLab运行环境介绍 ppt 由会员分享 可在线阅读 更多相关 MatLab运行环境介绍 ppt 48页珍藏版 请在人人文库网上搜索 1 MatLab用于图像处理 第一节 MATLAB语言概述 一 MATLAB语言的发展 matlab语
  • java spring cloud 企业工程管理系统源码+二次开发+定制化服务

    鸿鹄工程项目管理系统 Spring Cloud Spring Boot Mybatis Vue ElementUI 前后端分离构建工程项目管理系统 1 项目背景 一 随着公司的快速发展 企业人员和经营规模不断壮大 为了提高工程管理效率 减轻
  • Hibernate 总结

    Hibernate Hibernate是什么 Hibernate是一个框架 framework Hibernate是一个orm框架 Orm object relation mapping 对象关系映射 框架 Hibernate处于项目的持久
  • nrf52832--官方例程ble_app_uart添加led特性,实现电脑uart和手机app控制开发板led开和关

    硬件 nrf52832开发板 软件 编译环境 keil SDK版本 nRF5 SDK 17 1 0 ddde560 协议栈版本 s132 nrf52 7 2 0 softdevice 实现功能 在官方串口例程ble app uart的基础上
  • 30多种EMC标准电路分享-接口电路

    目录 01AC24V接口EMC设计标准电路 02AC110V 220VEMC设计标准电路 03AC380V接口EMC设计标准电路 04AV接口EMC设计标准电路 05CAN接口EMC设计标准电路 06DC12V接口EMC设计标准电路 07D
  • 数据库属性映射注解

    Entity 实体注解 Table name cst customer 用来将实体和表建立映射 public class Customer Id GeneratedValue strategy GenerationType IDENTITY
  • JSON处理——FastJson、Jackson、Gson详细使用

    文章目录 一 基本介绍 二 FastJson使用 2 1 对象序列化为JSON字符串 2 2 JSON字符串反序列化为对象 2 3 JSON对象 JSON数组的其他操作 2 4 JSONPath解析JSON 三 Jackson使用 3 1
  • 人工神经网络的拓扑结构,三层神经网络结构图

    人工神经网络的基本组成是什么啊 谷歌人工智能写作项目 小发猫 神经网络BP模型 一 BP模型概述误差逆传播 ErrorBack Propagation 神经网络模型简称为BP Back Propagation 网络模型常见的神经网络结构 P
  • 数据仓库工程师的职业规划

    从2011年3月开始从事数据仓库工作 算起来马上三年了 这三年做过etl工程师 做过模型架构师 做过团队管理 也做过需求分析 数据挖掘 如今又做回etl工程师 只是为了蹲得低点跳的更高 下面谈谈做各个职位的心得 etl工程师 比较简单 技术
  • 解决方法-电脑上打字出现字母分开间隔很大的情况

    电脑语言栏打开微软拼音输入法 按键中模式切换 选中全 半角切换的shift 空格选项 由于全角和半角输入的差异导致的问题 同时按shift 空格键 切换全角 半角符号 即可解决问题
  • 内网穿透工具nps和frp

    nps https github com cnlh nps 免费 nps 的优势在于有一套官方提供的web管理端 service端在云上搭建 ip 8080 登陆service 账号 admin 密码 123 client端搭建在内网机器上
  • Flink Yarn 模式启动 错误问题集锦

    1 Yarn 模式启动找不到类的问题 Caused by java lang ClassNotFoundException javax ws rs ext MessageBodyReader at java net URLClassLoad
  • 前端Ajax之请求

  • 网络协议——七层、五层、四层协议概念及功能

    OSI是一个开放性的通信系统互连参考模型 它是一个定义得非常好的协议规范 OSI模型有7层结构 每层都可以有几个子层 OSI的7层从上到下分别是 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 其中高
  • 知云文献翻译打不开_Xtranslator翻译软件:文献、网页、word,所有翻译阅读统统拿下...

    由于知云只支持PDF格式 有人希望翻译阅读英文网页 WORD 软件的chm格式帮助文件等等 还有些人有自己喜欢的PDF阅读器 比如foxit reader等 使用知云则无法使用自己喜欢的PDF阅读器了 还有些高频使用PDF注释功能的人不习惯
  • VS开发Linux程序(VisualGDB)

    点击打开链接 VisualGDB是在vs上开发Linux程序的工具 利用visual studio强大的功能调试Linux程序真的是很惬意的一件事情 VisualGDB支持Linux的原理是 通过ssh连接到Linux系统上通过ssh给li
  • shell脚本进阶1——精读ansible+shell脚本

    文章目录 一 脚本规划思路 二 主控机shell脚本 2 1 脚本输出字体特效 2 2 生成菜单栏对话框 2 3 配置本地yum源仓库 2 4 配置受控机yum源 2 5 关闭防火墙和selinux 2 6 把docker安装包给受控机 2