Playbook 与ad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstack的state状态文件。ad-hoc无法持久使用,playbook可以持久使用
playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色
从根本上来讲,所谓的task无非是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务

Playbook使用场景
1、执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作的时候,执行的ad-hoc命令是不合适的免费源码下载,这时候最好使用playbook
2、就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式
3、使用playbook可以方便的重复使用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码
4、在你使用Ansible的过程中,你也会发现,你所处理的大部分操作都是编写playbook可以把常见的应用都编写playbook,之后管理服务器会变得很简单
Playbook核心元素
Hosts 执行的远程主机列表
Tasks 任务集
Varniables 内置变量或自定义变量在playbook中调用
Templates 模板,即使用模板语法的文件,比如配置文件等
Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码
Playbook语法
playbook使用yaml语法格式,后缀可以是WordPress模板yaml,也可以是yml
在单一一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾,也可省略
次行开始正常写playbook的内容,一般都会写上描述该playbook的功能
使用#号注释代码
缩进必须统一,不能空格和tab混用
缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的
YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感
k/v的值可同行写也可以换行写。同行使用:分隔
v可以是个字符串,也可以是一个列表
一个完整的代码块功能需要最少元素包括 name: task
playbook与AD-Hoc的关系
①playbook是高防服务器对AD-Hoc的一种编排方式
②playbook可以持久运行(重复),而Ad-Hoc只能临时运行
③playbook适合复杂的任务,而Ad-Hoc适合做快速简单的任务(检查,查询, 巡检)
④playbook能控制任务执行的先后顺序
ad-hoc 用于检查,测试,临时获取数据
playbook剧本适用于,重复性操作(部署环境、服务,初始化操作(优化))
Playbook急速入门
剧本格式叫yaml格式为yml
缩进不要用tab键,要用空格键

核心格式剧本中所有的内容要对齐
对齐的时候不能使用tab键
只能使用空格,2个空格
hosts用于指定在哪些主机执行指令
tasks: 用于对于这些主机,运行什么模块及选项
| hosts 配置介绍
# cat /etc/ansible/hosts [web] 10.0.0.101 10.0.0.102 [nfs] 10.0.0.103 [backup] 10.0.0.104| 在所有机器的/tmp下面创建oldboy.txt
# 创建存放剧本的目录 mkdir -p /oldboyedu/ansible/playbook/ # yml文件配置 cat >01.touch.yml<<EOF - hosts: all vars: filename: oldboy.txt tasks: - name: touch file shell: touch /tmp/{{ filename}} EOF # 运行playbook剧本 ansible-playbook 01.touch.yml
| 添加定时同步时间的定时任务
原始命令行的ansible命令:
ansible all -m cron -a name="sync time by lidao996 20221111" minute="*/2" job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present ansible all -a crontab -l修改为剧本之后:
# 简单粗暴版本 --- - hosts: all tasks: - name: add cron sync time cron: name="sync time by lidao996 20221111" minute="*/2" job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present # 格式优化后 --- - hosts: all tasks: - name: add cron sync time cron: name: "sync time by oldboyedu" minute: "*/2" job: "/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state: present在剧本中使用模块和选项
选项最好是一行一个选项,选项后面的跟着冒号
选项要对齐与缩进

| 批量下载安装zabbix-agent2客户端并启动
部署流程

剧本编写
- hosts: 10.0.0.101 tasks: - name: 1. download zabbix agent2 rpm get_url: url: https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent2-6.0.0-1.el7.x86_64.rpm dest: /tmp/ validate_certs: no - name: 2. install zabbix agent2 rpm yum: name: /tmp/zabbix-agent2-6.0.0-1.el7.x86_64.rpm state: installed - name: 3. start zabbix agent2 service systemd: name: zabbix-agent2 enabled: yes state: started| 部署rsync服务端
准备:当前目录中包含,rsyncd.conf配置文件
剧本编写
- hosts: backup tasks: - name: 1)服务部署:yum 安装rsync yum: name: rsync state: latest - name: 2)配置文件分发 copy: src: /tmp/rsyncd.conf dest: /etc/rsyncd.conf backup: yes - name: 3)创建虚拟用户rsync user: name: rsync shell: /sbin/nologin create_home: no state: present - name: 4)密码文件和权限 lineinfile: path: /etc/rsync.password mode: 0600 line: "rsync_backup:1" create: yes - name: 5)修改模块对应目录的所有者 file: path: /data/ owner: rsync group: rsync state: directory - name: 6)重启rsync服务 systemd: name: rsync enabled: yes state: startedAnsible变量相关
变量分类

| vars, vars_files, group_vars方式
方法一:vars
剧本中定义变量
- hosts: all vars: dir_name: /oldboyedu file_name: oldboy.txt tasks: - name;01. mkdir file: path: "{{ dir_name}}" state: directory - name: 02. touch file: path: "{{ dir_name}}/{{ file_name}}" state;touch方法二:vars_files
把变量存放到一个文件中. 剧本比较大的时候
cat >vars.yml<EOF dir_name: /oldboyedu file_name: oldboy.txt EOF剧本编写
- hosts: all vars_file: ./vars.yml tasks: - name: 01. mkdir file: path: "{{ dir_name}}" state: directory - name: 02. touch file: path: "{{ dir_name}}/{{ file_name}}" state: touch方法三:group_vars
创建一个变量文件,给某个组共用
用法:
需要创建一个group_vars目录
目录下面创建以主机组命名的目录
存放变量文件vars.yml

根据不同的主机组创建对应的目录
变量文件内容
# cat group_vars/backup/vars.yml dir_name: /oldboy_backup # cat group_vars/web/vars.yml dir_name: /oldboy_web剧本内容
- hosts: all tasks: - name: 根据不同主机创建不同目录 file: path: "{{ dir_name}}" state: directory
使用group_vars的all组定义变量
变量文件内容
# cat group_vars/all/vars.yml dir_name: /oldboyedu_all file_name: oldboy.txt剧本内容
- hosts: all tasks: - name: 01. mkdir file: path: "{{ dir_name}}" state: directory - name: 02. touch file: path: "{{ dir_name}}/{{ file_name}}" state: touch
变量基础定义小结

| ansible-facts变量
facts变量说明 :ansible内置变量,执行剧本,有个默认的任务(task),收集每个主机的基本信息
查看 ansible facts变量内容
ansible web -m setup常用fact变量

系统巡检
获取所有机器的基础信息保存到/tmp/主机名命名文件中
步骤:
创建文件
写入内容
# 剧本内容 - hosts: all tasks: - name: 创建文件并写入系统基本信息 lineinfile: path: /tmp/{{ ansible_hostname}} create: yes line: "主机名:{{ ansible_hostname}}\n ip地址:{{ ansible_default_ipv4.address}}\n 内存总计:{{ ansible_memtotal_mb}}"facts小结
如果ans中使用到了一些系统的基础信息. 比如: ip地址,主机名,时间
如果没有这种需求或通过别的方式实现这个需求,可以关闭facts功能,让剧本执行加速. 使用gather_facts: no
- hosts: all gather_facts: no vars: dir_name: /oldboyedu file_name: oldboy.txt tasks: - name;01. mkdir file: path: "{{ dir_name}}" state: directory - name: 02. touch file: path: "{{ dir_name}}/{{ file_name}}" state;touch| ansible-register变量
相当于创建压缩包压缩包名字包含时间;tar打包压缩,date获取时间
tar zcf /tmp/etc-`date +%F`.tar.gz /etc/创建以主机名命名文件/opt/主机名
步骤:
获取主机名:hostname
创建文件,使用上一步的结果
register: 变量名字 # 这个变量的内容,叫json格式. register: hostname # json格式,只想要输出标准输出 stdout standard output 标准输出. hostname.stdout #取出命令的结果 `hostname` # 剧本编写 - hosts: all tasks: - name: 01. 获取主机名 shell: hostname register: hostname - name: 输出变量内容 debug: msg: "{{ hostname}}" - name: 02. 创建文件 file: path: /opt/{{ hostname.stdout}} state: touch
| 变量小结
为何使用变量:
剧本,脚本使用的变量放在一个文件中,剧本开头的
一般存放:用户名,用户组,目录,端口

(责任编辑:应用开发)