1、playbook的组成部分
(1)task任务:在目标主机上执行的操作,使用模块定义这些操作,每个任务都是一个模块的调用
(2)variables变量:存储和传递数据(变量可以自定义,①在playbook中定义为全局变量②可以外部传参)
(3)templates模板:用于生成配置文件,模板是包含占位符的文件。占位符由ansible在执行时转化为变量值
(4)handlers处理器:有变更时,可以执行触发器
(5)rolse角色:组织和封装playbook,允许把相关的任务、变量、模板以及处理器组织成一个可复用的单元
2、实例模板
ansible-playbook test1.yaml --syntax-check 检查yml文件的语法 |
ansible-playbook test1.yaml --list-task 查看任务 |
ansible-playbook test1.yaml --list-hosts 查看在哪台主机生效 |
ansible-playbook test1.yaml 运行ynl文件 |
ansible-playbook test1.yaml --start-at-task='install httpd' 指定剧本演出 |
测试
(1)在远程主机切换用户(很少用,基本上都会给root权限)
①用户yst执行此脚本,但yst权限不够,使用root用户权限
②取消密钥对认证
③声明密码和用户(即便取消密钥对认证也要声明密码和用户)
④运行playbook剧本ansible-playbook test1.yaml -K
(已在脚本中设置用有权限的用户时用大K)
(2)指定用户但用户没权限执行此剧本(很少用,基本上都会给root权限)
运行要指定有权限的用户并用小k
ansible-playbook test1.yaml -u root -k
3、声明和引用变量以及外部传参变量
(1)内部传参
vars: groupname: yst username: yyy 字典方式:key-values | |
-开头 | 表示列表 |
name: "{{ username }}" 引用变量username | |
"{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}" 包含所有主机变量的字典 #获取目标主机的IP地址 | |
hostvars | 打印 |
inventory_hostname | 目标主机的主机名 |
ansible_default_ipv4 | 获取目标主机名 |
['ansible_default_ipv4']['address'] | 相当于filter过滤出ansible_default_ipv4中的IP地址 |
检验yml文件语法
运行yml文件
测试
(2)外部传参
ansible-playbook test2.yml -e 'username=rrr groupname=ymr'
测试
4、条件判断
when:一个比较常见的应用场景,实现满足条件即执行,不满足条件即跳过任务(满足条件即执行,不满足条件不执行)
debug: msg: '位置判断' 相当于echo,用于脚本的调试,在正式脚本中去除 |
实题:hosts:all,满足条件IP=20,安装nginx;满足条件IP=30,安装httpd
测试
5、循环
ansible有多种循环格式
(1)with_items循环遍历(最常用)
①声明一个列表
②声明多个列表(把所有列表当成一个整体的列表来遍历)
③在一个目录下创建两个不同的文件
(2)with_list列表分组循环
①分组打印
②在一个目录下创建两个不同的文件
(3)with_together列表组循环(列表对应的列、数据结合的方式循环)
(4)with_nested列表中元素定义了循环的次数,第一层定义了循环的次数,第二层列表相当于内循环,表示第一层中的每个元素会循环几次
实题1:基于循环创建文件、目录、用户组
实题2:用户名test1 test2 组名分别是dn1 dn2
实题3:yum一键安装tree sl nginx httpd vsftpd dhcp多个软件
测试
实题4:在本机上创建123 456 789文件,分别复制到目标主机的test1 test2 test3目录中
测试
6、templates模块(传参模块)
定义:jinja模板架构,通过模板可以实现向模板文件传参(python转义),把占位符参数传到配置文件中
jinja模板架构:生成一个目标文本文件,传递变量到需要的配置文件中(用于web开发)
实题1:定义占位符传送httpd配置文件到目标主机
①修改ansible的配置文件定义占位符
②复制配置文件(必须以.j2结尾,j2表示占位符)
③修改以.j2结尾的httpd配置文件
vim /opt/httpd.conf.j2
④创建剧本vim http.yml
⑤运行剧本
⑥验证配置文件是否传送目标主机
在httpd.conf.j2中 | 配置占位符(声明的变量) |
在/etc/ansible/hosts中 | 配置主机的占位符名称和j2文件中的占位符一致(定义参数:声明占位符的参数) |
在剧本playbook中 | 用template模块把参数传给目标主机的配置文件 |
实题2:定义占位符传送nginx配置文件到目标主机
①在ansible配置文件中定义占位符
②复制nginx的配置文件(以.j2结尾,j2表示占位符)
③修改以.j2结尾的nginx配置文件
④创建nginx剧本
⑤运行剧本
⑥验证配置文件是否传送到目标主机
结论:配置文件传送成功
⑦测试
7、tags模块(标签模块)
(1)定义:可以在playbook中为任务设定标签(tags),在运行playbook时可以通过指定任务标签,实现只运行设定的标签任务
(2)任务标签的种类
always | 无论是否运行了指定标签,任务都会执行 |
never | 即使运行了指定标签,任务也不会执行(很少用) |
debug | 调试任务 |
setup | 收集主机信息 |
自定义标签 | |
per_tasks | 运行指定标签之前的任务 |
post_tasks | 运行指定标签之后的任务(很少用) |
(3)格式
tags:
- 标签种类
(4)运行剧本标签格式
ansible-playbook test.yml --tags=”debug”
(5)实例
实题:在目标主机创建文件touch /opt/guoqi.txt,标签always
在目标主机复制文件/opt/wdf.txt,标签never
第一次运行剧本,不指定标签,查看文件生成情况
第二次运行剧本,指定标签为never,查看文件生成情况
自定义标签
注:always是默认模块,无论是否定义always标签都会执行
8、roles模块(角色模块)
(1)定义:ansible中的roles模块是一个层次化、结构化的组织。可以根据层次结构自动装载变量文件、tasks、handlers
(2)作用:分别把变量、文件、任务、模块以及处理器放在单独的目录中,使用roles模块一键调用这些文件
(3)结构
目录 | 作用 | 创建固定的文件名才能使用 |
webs | 总目录。存放角色 | site.yml用来调用所有的配置文件 |
files | 存放copy和scripts模块调用的文件 | / |
templates | 存放j2的模板文件 | / |
tasks | 包含任务的目录。角色运行的任务 | main.yml(固定) |
handlers | 包含处理器的目录 | main.yml(固定) |
vars | 存放变量的目录 | main.yml(固定) |
defaults | 包含默认变量的目录 | main.yml(固定) |
meta | 包含元信息的目录 | main.yml(固定) |
创建roles远程安装httpd、mysql、php服务实验
1、创建roles目录
2、创建httpd角色
3、创建mysql角色
4、创建php角色
5、编写site.yml(在总目录下)【site.yml是总指挥,调用这些角色】
6、运行roles
7、验证在目标主机上远程安装是否成功
结论:远程安装http、mysql、php成功