你是否也曾遭遇这般绝望境况: 凌晨三点时分, 生产环境触发故障, 你得登录几十台服务器, 逐行敲下命令, 要手动进行艰难排查, 而后重启且修补问题。待完毕忙碌, 天色已然放亮。更为怖惧的是, 公司服务器数量从100台扩展至5000台, 你察觉单纯手动实施运维之举完全难以为继——因其效率低下, 容易出现差错, 而且颇具扩展难度。这并非是能力不足, 而是工具的选择存有偏差。今日咱们所谈及的,正是那个可令运维从忙碌至极转变为可轻松惬意的得力工具。
先说它因何这般厉害, 市面上自动化工具众多, 需装客户端, 配置繁杂, Chef学起来仿若学一门全新语言, 究竟为何呢? 一句话: 无需代理。你在控制节点装设软件, 受控节点只要具备SSH接入便可运行。简而言之, 不必在每台机器上安装应用, 直接经SSH连接来执行指令, 安全且简便。并且其采用YAML语法, 编写配置文件如同列清单一目了然, 学起来比煮菜还简易易上手。
说到最为关键的一点, 那便是幂等性, 其意思是, 当你对于同一个任务进行重复性执行操作时, 是不会产生副作用的。比如说, 你编写了一个任务名为“安装Nginx”, 当你首次运行这个任务的时候, 它所执行的操作是开始安装, 然而当你运行第二次的时候, 它能够检测到Nginx在此设备上已经处于安装完成状态, 于是会直接跳过安装步骤。正是因为如此, 才避免了脚本因为重复执行而招惹出乱子的情况发生。有许多经验丰富的老运维人员在运用Shell脚本时, 每次脚本运行完毕后, 都需要目不转睛地观察上好半天, 就生怕有哪儿被改动后致使出现崩溃的情况。而拥有声明式配置的特性, 能够让你明确指定出“目标状态”, 随后它会自行判断是否需要开展操作予以执行。
多得吓人的场景, 批量初始化新服务器, 装系统, 配基础软件, 设安全基线, 一个就能搞定。应用部署和滚动更新, 停服务器? 这是不存在的, 新服务器能控制并行数, 首先更新百分之十的机器, 确认没有问题之后再进行全量放行。不管你使用的是物理机, 还是虚拟机, 亦或是云服务器, 不管是阿里云, 还是 AWS, 又或是华为云, 一个工具就能管理全部。日常巡检以及故障修复, 同样能够写成自动化任务, 半夜出现问题会自动重启服务, 比你设置的闹钟还要准时。
好, 咱们从零点开始搭建环境, 控制节点推荐使用Linux, 或者也都可以。包管理器安装最为省事, 首先配置EPEL仓库, 接着使用`yum`, 直接使用`apt`。要是版本想要自行控制, 运用pip, 输入`pip ==7.6.0`。安装完成之后, 受控节点必须符合三个条件。一是SSH服务开启, 二是版本在2.7以上, 三是SSH免密登录。密钥对认证最好配置妥当, 否则每次执行都要输入密码, 自动化变为手动化就毫无意义了。
验证连通性很简单,在控制节点执行一行命令:
```
all -i ',' -m ping
```
发现呈现返回`pong`, 恭贺你, 环境搭建妥当了。此命令之中`-i`界定主机清单, `-m`界定模块, `ping`模块的用处为本测试可不可以连接通。
提及主机清单, 它乃是你的服务器通讯录, 最为常见的写法呈现为INI格式, 举例来说。
```
web01 =192.168.1.10
web02 =192.168.1.11
db01 =192.168.1.20
```
你能够进行组变量定义, 比如说对于所有机器而言采用同一个SSH用户: ` =admin` ,要是服务器数目很多, 运用范围表示法: ``自动生成db1、db2、db3。
接下来要讲的是核心部分, 也就是模块。有几百个模块是自带的, 这就如同给了你一个放置工具的箱子。其中最常被使用的是这几个:
- `ping`:测连通性。
与`shell`相比: 可执行任意命令。其差异在于`shell`具备管道、重定向、变量的支持, 然而``更加安全, 能够规避Shell注入风险。倘若可以使用``,那么就不要使用`shell`。
将原本地处本地的文件, 复制至远程服务器之上。创建文件或者删掉已有文件, 创建目录或者撤销目录, 对所涉及的那些设置权限进行操作。依据给定的那种模板依靠动态化手法生成相应配置文件 , 像Nginx对应相关时, 会出现名为`nginx.conf.j2`的文件那般 , 此文件之中的一些变量会自行进行替换。
`yum`以及`apt`,用于安装软件包, 其中`state=`的情况是, 若为安装, 若为卸载, 若为升级到最新。
- ``和``:控制服务启停,设置开机自启。
要创建用户, 要设置密码, 且要加组, 对于`cron`而言, 是要添加定时任务。
模块乃小工具, 而真正具极大效应之举措是, 将繁多任务加以编排从而形成剧本, 典型便呈现为如此样貌:
```yaml
---
- name: 部署Nginx服务器
hosts:
: yes
vars:
: 8080
tasks:
- name: 安装Nginx
yum:
name: nginx
state:
- name: 复制配置文件
:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
- name: 启动并设置开机自启
:
name: nginx
state:
: yes
```
变量的来源呈现出诸多不同样式, 在里面予以定义, 于主机清单里进行书写, 通过命令行借助`--extra-vars`来进行传递, 又或者采用`动态作出计算。在优先级层面, 命令行具备最高级别, 其次呢, 再者是, 最终是默认值。你能够运用`获取主机相 的关信息, 打个比方操作系统种类: `when:”。
''
== ""`,这样一套剧本能在和上通用。
条件控制会采用“when”, 循环则会运用“loop”。比如说去安装多个包这样的情况: 。
```yaml
- name: 安装常用软件
yum:
name: "{{ item }}"
state:
loop:
- git
- vim
- curl
```
存在一种进阶用法, 它是这样的, 当某个任务的状态出现变化的时候, 才进行执行, 举例来说, 比如在修改了Nginx配置之后, 会自动重启服务, 此用法通过``触发。
```yaml
tasks:
- name: 更新配置
:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
: nginx
:
- name: nginx
:
name: nginx
state:
```
注意,只在所有任务执行完后统一运行,而且只执行一次。
错误处理能够采用`block`加上回车符, 这跟编程之中的try-catch相似呀。
```yaml
- block:
- name: 启动服务
: name=httpd state=
:
- name: 启动失败,尝试重启
: name=httpd state=
:
- name: 记录日志
debug: msg="操作完成"
```
当你撰写了诸多内容之后, 便会发觉存在许多任务出现了重复的情况。在这个时候, 就轮到角色(Roles)闪亮登场了。角色对诸如任务、变量、模板、文件等事物进行组织, 使其形成标准的目录结构。
```
roles/
nginx/
tasks/main.yml
/main.yml
/main.yml
vars/main.yml
/
files/
```
用`- init nginx`自动生成骨架。然后在里引用:
```yaml
- hosts:
roles:
-
- nginx
```
你能够定义角色依赖, 举例来说, 像Nginx依赖角色, 于`meta/main.yml`里书写`:。
{ role: }
`。这样别人用你的角色时,依赖自动安装,像搭积木一样。
全新实战案例闪亮登场啦: 轻轻松松一键就能完成LNMP环境(Linux加上Nginx加上MySQL加上PHP)的部署工作。搞定它只需分几步走, 首先第一步要做的是安装Nginx, 接着还要利用相应工具生成配置;迈出第两步, 紧接着是安装MySQL, 其中还要专门设置root密码(这个密码的密文可是用-vault进行加密处理的哟);然后来到第三步, 需要安装PHP-FPM, 同时还要细致地配置连接;最后一步, 就是启动全部的服务并且妥善设置为自启状态。整个部署过程当中完全不需要手动去登录任何一台机器。你所要做的仅仅是执行`- -lnmp.yml`这个指令, 之后悠闲地去喝上一杯咖啡, 等你喝完回来就惊喜地发现已经部署妥当。
怎么去玩滚动更新呢? 使用“控制并行度: : 5”从而表明每次仅仅更新5台机器。在更新以前运用“等待旧服务停止, 新服务启动后验证端口是否开放”。结合“tags”能够控制仅仅执行某个阶段, 举例而言只是更新配置却不更改代码。
于安全范畴来讲, 切勿将敏感信息进行硬编码。采用`-vault .yml`予以加密, 在执行期间添加`--ask-vault-pass`。针对日志收集而言, 能够接入ELK, 通过回调插件朝着监控平台发送执行结果。就权限方面而言, 控制节点运用普通用户并搭配sudo, 请勿直接以root身份开展工作。
性能方面的优化常常会遭受到忽视这一情况。开启 SSH这件事, 在.cfg里进行设置, 将其设为`=True`, 这样一来能够减少 SSH握手的次数, 速度能加快一大截。关闭事实收集, 也就是在你并不需要主机信息的情况下, 写入`: no`, 如此能够节省几秒甚至几十秒时间。另外还能够运用`rgs`来对 SSH参数加以优化, 像进行压缩传输这种方式。
首先来讲扩展, 它与CI/CD是天生的一对, 通过里调“-”, 能够达成代码提交所带来的自动部署运作。AWX也就是红盾的Web版本, 借助它产品经理仅需点点鼠标便可执行相关任务。事件驱动自动化方面, 监控告警会触发自动修复机制的启动, 像磁盘超过90%时便会自动清理日志操作得以实现。并且在有需要WinRM的情形下还可以管控设备, 对于网络设备诸如Cisco、华为等也具备管理能力。
有一种清晰的学习路线, 首先要掌握环境搭建以及Ad - Hoc命令, 接着熟练掌握十几个核心模块, 然后去写第一个部署单机服务, 之后引入变量、条件以及循环, 并将其重构为角色, 最后集成CI / CD和监控, 再上线到生产环境。还有一些别犯的低级错误, 首先别什么都采用shell模块, 因为非幂等操作很容易搞崩系统, 之后要注意变量的作用域, 千万别定义出现冲突, 并且密码永远都要用vault加密。
自动化并非是为了去炫耀技艺, 其目的在于能够将时间运用在更具价值的事项上面。若你花费仅仅十分钟即做完了从前一整天的工作, 你便已然将会察觉, 原来从事运维工作居然能够让人如此畅快。当下, 开启你的电脑, 安装一则, 而后撰写而成你的首个内容。要是存在哪些问题或者心得体会, 于评论区展开交流探讨, 我都将会逐个去做回复。