ansible自动化运维工具(5)

一. 实施处理程序

1. 处理程序

处理程序是响应由其他任务触发的通知的任务

1.1 只有在 template 任务通知已发生更改时才触发
在这里插入图片描述

1.2 ansible 把 notify 语句当作数组
在这里插入图片描述

  • 写 playbook
    在这里插入图片描述
    在这里插入图片描述

1.3 使用处理程序注意

1.处理程序始终按照 play 的 handlers 部分指定的顺序运行,不按 notify 里的

2.处理程序通常在相关 play 中所有其他任务运行完后运行

3.处理程序名称存在于个 play 命名空间中(如果两个处理程序同名,只会运行一个)

4.如果多个任务通知处理程序,处理程序也只会运行一次

5.如果包含 notify 的语句任务没有报告 changed 结果,则处理程序不会获得通知
在这里插入图片描述

2. 处理任务失败

通常 playbook 遇到错误会中止执行,但是有时我们想要失败时也继续执行

2.1 忽略任务失败
关键字:ignore_errors
在这里插入图片描述

在这里插入图片描述

2.2 任务失败后强制执行处理程序
通常任务失败,play 会中止,那么收到 play 中之前任务通知的处理程序将不会运行,如果要运 行,需要使用关键字:
force_handlers:yes

在这里插入图片描述
在这里插入图片描述

2.3 指定任务失败条件
关键字:failed_when
在这里插入图片描述
2.4 指定任务何时报告"Changed"结果
关键字:changed_when

在这里插入图片描述

2.5 ansible 块和错误处理
三种关键字

block 定义要运行的主要任务
rescue 定义要在 block 子句中定义的任务失败时运行的任务
always 定义时中独立运行的任务

练习:
1. 故意制造错误
在这里插入图片描述
在这里插入图片描述
2. 添加忽略关键字
在这里插入图片描述
在这里插入图片描述
3. 使用 block、rescue、always 将任务分开
在这里插入图片描述
在这里插入图片描述
4. 再修改,将 http 的包改为正确
在这里插入图片描述
在这里插入图片描述
5. 控制’changed’条件
在这里插入图片描述

运行发现 check time 任务始终是 changed
因为任务没有更改受管主机,所以不应该每次都是 changed
在这里插入图片描述
6.修改文件

在这里插入图片描述

在这里插入图片描述
7. 使用 failed_when 关键字
在这里插入图片描述
在这里插入图片描述

3. 总结

1.循环迭代的方法

2.条件用于仅再符合特定条件时执行任务或 play

3.处理程序用法

4.只有任务报告受管主机做了更改,才会通知处理程序

5.处理任务失败,即使成功的任务也可以标记为失败

6.block块用于将任务分组为单元,通过任务是否成功来确定执行其他任务与否

二. 在受管节点上创建文件或目录

修改文件并将其复制到主机

2.1 常用文件模块
blockinfile 将文本块添加到现有文件
copy 将文件复制到受管主机
fetch 从受管主机拷贝文件到控制节点
file 设置文件属性
lineinfile 确保特定行位于某个文件
stat 检索文件状态信息
synchronize rsync 命令的一个打包程序
2.2 file 模块处理文件

file 模块处理文件,如果不存在就新建
在这里插入图片描述
在这里插入图片描述

  • 修改文件属性
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 永久更改
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.3 在受管主机上复制和编辑文件
blockinfile
blockinfile 模块帮助我们在指定的文件中插入”一段文本”,这段文本是被标记过的,也就是我们在这段文本上做了记号,以便在以后的操作中可以通过”标记”找到这段文本,然后修改或者删除它

blockinfile copy fetch lineinfile

2.4 从受管主机中删除文件
在这里插入图片描述
2.5 检测受管主机上的文件状态

MD5 全称是报文摘要算法,此算法对任意长度的信息逐位计算,产生一个二进制长度为 128 位(十六进制长度 32 位)的报文摘要

在这里插入图片描述
在这里插入图片描述

2.6 同步控制节点和受管主机之间的文件
synchronize模块主要用于目录、文件的同步,主要基于rsync命令工具同步目录和文件
常用的src为源目录,dest为目标目录
在这里插入图片描述

三. 使用 jinja2 模板部署自定义文件

3.1 jinja2模块介绍

1. jinja2简介

jinja2具有以下优点:

1.相对于Template,jinja2更加灵活,它提供了控制结构,表达式和继承等。
2.相对于Mako,jinja2仅有控制结构,不允许在模板中编写太多的业务逻辑。
3.相对于Django模板,jinja2性能更好。
4.Jinja2模板的可读性很棒。
{% EXPR %} 表达式或者逻辑
{{ EXPR }} 最终向用户输出表达式或结果
{# COMMENT #} 注释

2.构建 jinja2 模板

jinja2 模板由多个元素组成:数据、变量、表达式

模板中使用的变量可以在 playbook 的 vars 中指定

模板中所有的值都使用变量方式,将来会被受管主机对应的值替代

vim /etc/ssh/sshd_config

在这里插入图片描述

3. 部署 jinja2 模板

在这里插入图片描述

3.2 控制结构

1. 使用循环

. jinja2 使用 for 语句提供循环

1. 
{ % for user in users %} 
	{{ user }}         #user 变量将遍历 users
 {% endfor %} 
2.
  {% for myhost in groups['myhosts'] %}  #列出 myhosts 组中所有主机
  	 {{ myhosts }}
 {% endfor %}. 使用条件句

  {% if finished %}   #只有此条件为真,才会将 result 变量的值放入文件 
  		{{ result }}
   {% endif %} 

jinja2 的循环和条件只能在模板中使用,不能在 playbook 中使用

3.3 变量过滤器

{{ output | to_json }}     #以 json 格式输出
{{ output | to_yaml }} 


{{ output | from_json }}    #对 json 格式字符串进行解析
 {{ output | from_yaml }}

变量可以通过“过滤器”进行修改,过滤器可以理解为是jinja2里面的内置函数和字符串处理函数。

常用的过滤器有:

过滤器名称 说明
safe 渲染时值不转义
capitialize 把值的首字母转换成大写,其他子母转换为小写
lower 把值转换成小写形式
upper 把值转换成大写形式
title 把值中每个单词的首字母都转换成大写
trim 把值的首尾空格去掉
striptags 渲染之前把值中所有的HTML标签都删掉
join 拼接多个值为字符串
replace 替换字符串的值
round 默认对数字进行四舍五入,也可以用参数进行控制
int 把值转换成整型
  • 练习
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

3.4 总结

1.file 模块库包含创建、复制、编辑、修改等权限和其他属性

2.使用 jinja2 模板动态构建文件来部署

3.jinja2 模板由两个元素构成:变量和表达式,在使用 jinja2 模板时,他们被替换为值

4.通过 jinja2 过滤器,模板表达式可以从一种数据格式转换为另一种

四. 管理大项目

4.1 利用主机模式选择主机

1.使用通配符匹配多个主机
-hosts:'*'  匹配所有 
 -hosts:'*.example.com'   匹配所有已example.com结尾的主机 
  -hosts:'172.25.254.*'    匹配所有此网段的主机
2.通过列表匹配主机或主机组
-hosts:www1.example.com,www2.example.com,172.25.254.250   匹配此三台主机
-hosts:webservers,westos   匹配此两个主机组
3.将通配符和列表等一起使用 
-hosts:webservers,&westos 即属于webserver组也属于westos组  
4.匹配westos组中所有主机,但是 servera.lab.example.com除外 
-hosts:westos,!servera.lab.example.com
5.匹配所有主机除了servera.lab.example.com 
-hosts all,!servera.lab.example.com

4.2 管理动态清单

github 有很多动态清单脚本

编写动态清单程序

将 INI 格式的清单转换为 JSON 格式
在这里插入图片描述
在这里插入图片描述

4.3 配置并行

使用 forks 在 ansible 中配置并行
ansible 最大同时连接数由 ansible 配置文件中 forks 参数控制

在这里插入图片描述
可以在命令行使用 -f 或者 --forks 参数来指定并行数

4.4 管理滚动更新

如果更新发生在负载均衡服务器,更新完成会重启,可能导致后端所有 web 服务器停止服务, 可以使用 serial 关键字来分批运行
在这里插入图片描述
在这里插入图片描述

serial 参数优点:
在更新时如果出现问题,那么在前 2 台发生问题是 playbook 就会 停止运行,后面的服务器不会执行,那么也就保证了服务的高可用

4.5 包含和导入文件

大型 playbook 管理起来比较复杂,可以用模块化的方式管理

两种方法:包含、导入

1. 导入 playbook

例 1:
 - name: configure webserver
    import_playbook: web.yml 
    
例 2:
 - name: Play 1
    hosts: localhost 
    tasks:
      - debug: 
          msg: Play1
   - name: Import Playbook
     import_playbook: play2.yml

2. 导入和包含任务的 playbook

一个只有任务的 playbook
在这里插入图片描述

  • 导入任务

在这里插入图片描述

使用导入时,when 等条件语句应用于导入的每个任务;循环不能作用于导入的任务

  • 包含任务

在这里插入图片描述

3. 为外部 play 和任务定义变量

提高复用性

在这里插入图片描述
可以用于导入
在这里插入图片描述

4.6 管理大项目综合实验

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 运行

在这里插入图片描述
在这里插入图片描述

  • 测试

在这里插入图片描述

在这里插入图片描述

发布了47 篇原创文章 · 获赞 3 · 访问量 1365

猜你喜欢

转载自blog.csdn.net/rrrr_ffff/article/details/105492060