目录
1、YAML概述
■ YAML是一种非标记语言,是用来写配置文件的语言,非常简洁和强大
■ YAML语法和其他语言类似,也可以表达散列表、标量等数据结构
■ 结构通过空格来展示,序列里配置项通过-来代表,Map里键值用:来分隔,YAML的扩展名为yaml
1.1、基本语法规则
■ 大小写敏感
■ 使用缩进表示层级关系
■ 缩进时不允许使用Tab键, 只允许使用空格
■ 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
1.2、YAML支持的数据结构
1.2.1、对象
对象:键值对的集合,又称为映射(mapping) /哈希(hashes) /字典(dictionary)
例如: name:Example Developer
1.2.2、数组
数组: 一组按次序排列的值,又称为序列(sequence) /列表(list)
例如:
- Apple
- Orange
1.2.3、纯量
纯量:单个的、不可再分的值
例如:
number: 12.30
sure: true
2、Ansible的脚本—playbook剧本
■ 通过task调用ansible的模板将多个play组织在一个playbook中运行
2.1、playbooks组成
■ Tasks: 任务,即调用模块完成的某操作
■ Variables: 变量
■ Templates: 模板
■ Handlers: 处理器,当某条件满足时,触发执行的操作
■ Roles: 角色
2.2、补充命令
ansible-playbook nginx.yaml -- syntax-check #检查yaml文件的语法是否正确
ansible-playbook nginx.yaml --list-hosts #检查生效的主机
ansible-playbook nginx.yaml --list-task #检查tasks任务
ansible-playbook nginx.yaml --start-at-task='Copy Nginx.conf' #指定从某 个task开始运行
3、实操解析
3.1、为每个用户定义远程执行用户(普通用户与root用户对比)
3.1.1、在节点服务器创建用户设置密码
[root@webserver ~]# useradd lisi
[root@webserver ~]# passwd lisi
[root@webserver ~]# id lisi
3.1.2、创建playbook
[root@ansible ~]# vim demo1.yuml
[root@ansible ~]# ansible-playbook demo.yaml --syntax-check #检查语法
[root@ansible ~]# ansible-playbook demo.yaml #执行剧本
3.1.3、修改为root用户
[root@ansible ~]# ansible-playbook demo.yaml #执行剧本
小结:在剧本执行时还要考虑权限问题,执行任务的用户
3.2、指定远程主机sudo切换用户
[root@ansible ~]# vim demo.yaml
[root@ansible ~]# ansible-playbook demo.yaml --syntax-check
[root@ansible ~]# ansible-playbook demo.yaml
[root@webserver ~]# cd /home/lisi
[root@webserver lisi]# ll /
[root@ansible ~]# vim demo.yaml
[root@ansible ~]# ansible-playbook demo.yaml
[root@webserver lisi]# ll
3.3、创建安装apache,关闭防火墙,访问主页的案例
[root@ansible ~]# vim demo1.yaml
[root@ansible ~]# ansible-playbook demo1.yaml --syntax-check
[root@webserver ~]# rpm -q httpd
[root@webserver ~]# systemctl status httpd
3.3.1、浏览器访问
3.4、tasks列表和action
■ Play的主体部分是task列表, task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务在运行playbook时(从上到下执行),如果一个host执行task失败,整个tasks都会回滚,请修正playbook中的错误,然后重新执行即可。Task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行时幂等的,这意味着多次执行是安全的,因为其结果一致
■ 每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的
■ 定义一个task, 常见的格式:”module: options” 例如: yum: name=httpd
■ ansible的自带模块中, command模块和shell模块无需使用key=value格式
3.4.1、回滚示例
[root@ansible ~]# vim demo1.yaml
[root@ansible ~]# ansible-playbook demo1.yaml --syntax-check
[root@ansible ~]# ansible-playbook demo1.yaml
[root@webserver ~]# yum -y remove httpd #先删除httpd,再进行剧本测试
[root@webserver ~]# rpm -q httpd
总结:虽然出现报错,无法继续执行命令,但是上一条命令执行成功,apache成功安装,不用返回,说明tasks进行回滚,必须修正错误才可执行下去
3.4.2、忽略错误,强制成功测试
[root@ansible ~]# vim demo1.yaml
[root@ansible ~]# ansible-playbook demo1.yaml --syntax-check
[root@ansible ~]# ansible-playbook demo1.yaml
3.5、对于两个不同节点,分别做不同任务
[root@ansible ~]# vim demo2.yaml
[root@ansible ~]# ansible-playbook demo2.yaml --syntax-check
[root@ansible ~]# ansible-playbook demo2.yaml
[root@mysql ~]# cd /opt
[root@mysql opt]# ll
3.6、Handlers介绍
Handlers也是一 些task的列表,和一-般的task并没有什么区别
是由通知者进行的notify,如果没有被notify,则Handlers不会执行,假如被notify了,则Handlers被执行不管有多少个通知者进行了notify, 等到play中的所有task执行完成之后,handlers也只会被执行一次
3.6.1、引入变量
[root@ansible ~]# vim demo1.yaml
[root@ansible ~]# ansible-playbook demo1.yaml --syntax-check
[root@ansible ~]# ansible-playbook demo1.yaml
3.6.2、通过ansible命令传递变量
[root@ansible ~]# vim demo1.yaml
[root@ansible ~]# ansible-playbook demo1.yaml -e "aaa=httpd"
3.6.3、引用ansible的固定变量
[root@ansible ~]# vim test.yaml
[root@ansible ~]# ansible-playbook test.yaml --syntax-check
[root@ansible ~]# ansible-playbook test.yaml
[root@mysql opt]# ll
[root@mysql opt]# cat addr.txt
3.6.4、引用主机变量
在MySQL组的主机后面添加
[root@ansible ~]# vim test.yaml
[root@ansible ~]# ansible-playbook test.yaml
[root@mysql opt]# cat addr.txt
总结:变量使用场景
1:剧本使用的 服务名称,数据
2:命令 IP地址测试
3:节点hosts 系统的参数值
3.7、条件测试
如果需要根据变量、facts (setup) 或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,在Playbook中条件测试使用when子语句在task后添加when子句即可使用条件测试: when子句支持jinjia2表达式或语法
例如:
[root@ansible ~]# vim when.yml
[root@ansible ~]# ansible-playbook when.yml --syntax-check
[root@ansible ~]# ansible-playbook when.yml
3.8、多条件判断
[root@ansible ~]# vim when.yml
[root@ansible ~]# ansible-playbook when.yml --syntax-check
[root@ansible ~]# ansible-playbook when.yml
3.9、组条件判断
[root@ansible ~]# vim when2.yml
[root@ansible ~]# ansible-playbook when2.yml --syntax-check
[root@ansible ~]# ansible-playbook when2.yml
4、迭代
当有需要重复性执行的任务时(循坏),可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with items语句指明迭代的元素
[root@ansible ~]# vim b.yml
[root@ansible ~]# ansible-playbook b.yml --syntax-check
[root@ansible ~]# ansible-playbook b.yml
[root@webserver ~]# rpm -q httpd
[root@webserver ~]# rpm -q tomcat
4.1、迭代(自定义)
[root@ansible ~]# vim c.yml
[root@ansible ~]# ansible-playbook c.yml --syntax-check
[root@ansible ~]# ansible-playbook c.yml
[root@mysql ~]# id test1
[root@mysql ~]# id test2
4.2、总结
playbooks是一个非常简单的配置管理和多机器部署系统的基础,以及非常适合部署复杂应用程序的系统