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命令是不合适的WordPress模板,这时候最好使用playbook 2、就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式 3、使用playbook可以方便的重复使用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码 4、在你使用Ansible的过程中,你也会发现,你所处理的大部分操作都是编写playbook可以把常见的应用都编写playbook,之后管理服务器会变得很简单 Playbook核心元素 Hosts 执行的远程主机列表 Tasks 任务集 Varniables 内置变量或自定义变量在playbook中调用 Templates 模板,即使用模板语法的文件,比如配置文件等 Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行 tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码 Playbook语法 playbook使用yaml语法格式,后缀可以是站群服务器yaml,也可以是yml 在单一一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾,也可省略 次行开始正常写playbook的内容,一般都会写上描述该playbook的功能 使用#号注释代码 缩进必须统一,不能空格和tab混用 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的 YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感 k/v的值可同行写也可以换行写。同行使用:分隔 v可以是个字符串,也可以是一个列表 一个完整的代码块功能需要最少元素包括 name: task playbook与AD-Hoc的关系 ①playbook是b2b信息网对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: started Ansible变量相关 变量分类 
| 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  register: hostname hostname.stdout # 正常输出信息 hostname.rc # 取出返回值. hostname.stderr # 取出错误信息 | 变量小结 为何使用变量: 剧本,脚本使用的变量放在一个文件中,剧本开头的 一般存放:用户名,用户组,目录,端口 
|