介绍

playbook是一个或者多个“play”组成的列表,可以让他们连通起来按照事先的编排机制来执行;task无非是去调用playbook中的一个module,而在模式参数中可以使用变量;模块执行是按照幂等的,则多次执行是安全的,并且其结果均为一致

playbook核心组件

hosts:执行的远程主机列表
tasks:任务,由模块定义的操作列表
variables:变量(内置变脸/自定义变量)在playbook中调用
template:模块,即只用模板语法的文本文件(jinja2)
handlers:和notify结合使用,为条件触发操作,满足条件时才执行,否则不执行
roles:角色

variables

变量的来源:ansible setup facts远程主机的所有变量都可以用
自定义变量:
优先级:
通过命令行方式指定变量—优先级最高
在/etc/ansible/hosts定义变量,在主机组中的主机单独定义
在/etc/ansible/hosts定义变量,针对主机组中的所有主机集中定义变量
在playbook中定义变量(建议使用)

运行playbook:ansible-playbook命令
格式:ansible-playbook [选项及参数]
选项:
—syntac-check:检查语法
—check:测试运行
-t tag:指定运行特定的任务
-list-tags
-skip-tags SKIP_TAGS:跳过哪些标签
—start-at-task START_AT_TASK:从哪个任务后开始执行
handlers和notify结合使用触发条件,让Playbook在满足一定触发条件时再去执行某条task

template模板

-文本文件,内部嵌套有模板语言脚本
-jinja2是由python编写的,在我们打算使用基于文件的模板语言时,jinja2是很好的解决方案
YAML是写playbook,jinja2是写templates
功能:将模板文件里的变量转化成远程本地主机所对应的确定值

“ansible_facts”: {
“ansible_all_ipv4_addresses”: [
“172.16.128.8”,
“192.168.10.20”
]


当我们把包含{{ ansible_all_ipv4_addresses }}变量的模版文件从本地复制到对应
远程主机上,变量会被替换成确定值

- Templates文件必须放在templates目录下
- yaml文件需要和templates目录平级
ps:若yaml中指定的是绝对路径,则不需要满足以上条件,但是一般为了方便管理不会这么做

{{ ansible_facts[‘all_ipv4_addresses’] }}

playbook文本格式为YAML格式
YAML介绍:
表达数据序列化的格式,可以理解为一种标记性语法
特性:
它使用空白符号缩进和大量依赖外观的特色
特别适合用来表达或编辑数据结构
特点:

  1. YAML的可读性高
  2. 与脚本语言的交互性好
  3. 使用实现语言的数据类型
  4. 有一个一致的信息模型
  5. 易于实现
  6. 可以基于流来处理
  7. 表达能力强,扩展性好

官方示例

实验:

利用ansible-playbook获取主机地址
编写test.yaml文件/templates/test.yaml
image.png
注意:远程主机上的文件名test必须与j2前的文件名对应
编写test.j2文件
image.png
或者:ipaddress: {{ ansible_facts.ens33.ipv4.address}}
检查yaml文件语法:
image.png
测试任务执行:
image.png
查看远程主机的test文件:
image.png

playbook角色

路径:/etc/ansible/roles
角色1
角色2
角色3
每个角色都有如下目录
defaults:用于设定默认变量,一般会有个main.yaml文件
files:存放用于copy或script等模块调用的文件
headlers:定义各种headler,其他文件需要由main.yaml进行“包含”调用
meta:定义当前角色的特殊设定及其依赖关系,其他的文件需要由main.yaml文件进行”包含”调用
tasks:定义各种task,一般会有个main.yaml文件:其他文件需要由main.yaml文件包含调用
template:定义由template模块调用的模板文本
vars:定义各种variables变量,其他文件需要由main.yaml进行“包含”调用
image.png
如何调用roles:
定义在site.yaml文件中:/etc/ansible/roles/site.yaml

site.yaml文件: