处理程序是响应由其他任务触发的通知的任务
1.1 只有在 template 任务通知已发生更改时才触发
1.3 使用处理程序注意
1.处理程序始终按照 play 的 handlers 部分指定的顺序运行,不按 notify 里的
2.处理程序通常在相关 play 中所有其他任务运行完后运行
3.处理程序名称存在于个 play 命名空间中(如果两个处理程序同名,只会运行一个)
4.如果多个任务通知处理程序,处理程序也只会运行一次
5.如果包含 notify 的语句任务没有报告 changed 结果,则处理程序不会获得通知
通常 playbook 遇到错误会中止执行,但是有时我们想要失败时也继续执行
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.修改文件
1.循环迭代的方法
2.条件用于仅再符合特定条件时执行任务或 play
3.处理程序用法
4.只有任务报告受管主机做了更改,才会通知处理程序
5.处理任务失败,即使成功的任务也可以标记为失败
6.block块用于将任务分组为单元,通过任务是否成功来确定执行其他任务与否
blockinfile | 将文本块添加到现有文件 |
---|---|
copy | 将文件复制到受管主机 |
fetch | 从受管主机拷贝文件到控制节点 |
file | 设置文件属性 |
lineinfile | 确保特定行位于某个文件 |
stat | 检索文件状态信息 |
synchronize | rsync 命令的一个打包程序 |
2.3 在受管主机上复制和编辑文件
blockinfile
blockinfile 模块帮助我们在指定的文件中插入”一段文本”,这段文本是被标记过的,也就是我们在这段文本上做了记号,以便在以后的操作中可以通过”标记”找到这段文本,然后修改或者删除它
blockinfile copy fetch lineinfile
2.4 从受管主机中删除文件
2.5 检测受管主机上的文件状态
MD5 全称是报文摘要算法,此算法对任意长度的信息逐位计算,产生一个二进制长度为 128 位(十六进制长度 32 位)的报文摘要
2.6 同步控制节点和受管主机之间的文件
synchronize模块主要用于目录、文件的同步,主要基于rsync命令工具同步目录和文件
常用的src为源目录,dest为目标目录
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 模板
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 中使用
{{ 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 | 把值转换成整型 |
1.file 模块库包含创建、复制、编辑、修改等权限和其他属性
2.使用 jinja2 模板动态构建文件来部署
3.jinja2 模板由两个元素构成:变量和表达式,在使用 jinja2 模板时,他们被替换为值
4.通过 jinja2 过滤器,模板表达式可以从一种数据格式转换为另一种
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
github 有很多动态清单脚本
编写动态清单程序
使用 forks 在 ansible 中配置并行
ansible 最大同时连接数由 ansible 配置文件中 forks 参数控制
可以在命令行使用 -f 或者 --forks 参数来指定并行数
如果更新发生在负载均衡服务器,更新完成会重启,可能导致后端所有 web 服务器停止服务, 可以使用 serial 关键字来分批运行
serial 参数优点:
在更新时如果出现问题,那么在前 2 台发生问题是 playbook 就会 停止运行,后面的服务器不会执行,那么也就保证了服务的高可用
大型 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
使用导入时,when 等条件语句应用于导入的每个任务;循环不能作用于导入的任务
3. 为外部 play 和任务定义变量
提高复用性