Playbook介绍

Playbook与ad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstack的state状态文件。ad-hoc无法持久使用,playbook可以持久使用。
playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个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

一个简单的示例
普通用户配置ansible.cfg可以参考ansible.cfg配置
可以参考Ansible hosts文件写法
创建playbook文件
[root@ansible ~]# vim playbook.yml

---                       #固定格式
- hosts: 192.168.1.31     #定义需要执行主机,也可以是主机组,例如hosts: web  ,web在hosts的文件中(可以参考本小节上面的Ansible hosts文件写法)remote_user: root       #远程用户 或者是普通用户,普通用户要提权的话添加一下两项# become: yes             #2.6版本以后的参数,之前是sudo,意思为切换用户运行#  become_method: sudo   #以哪种方式提权,sudo或者suvars:                   #定义变量http_port: 8088       #变量tasks:                             #定义一个任务的开始- name: create new file          #定义任务的名称file: name=/tmp/playtest.txt state=touch   #调用模块,具体要做的事情- name: create new useruser: name=test02 system=yes shell=/sbin/nologin- name: install packageyum: name=httpd- name: config httpdtemplate: src=./httpd.conf dest=/etc/httpd/conf/httpd.confnotify:                 #定义执行一个动作(action)让handlers来引用执行,与handlers配合使用- restart apache      #notify要执行的动作,这里必须与handlers中的name定义内容一致- name: copy index.htmlcopy: src=/var/www/html/index.html dest=/var/www/html/index.html- name: start httpdservice: name=httpd state=startedhandlers:                                    #处理器:更加tasks中notify定义的action触发执行相应的处理动作- name: restart apache                     #要与notify定义的内容相同service: name=httpd state=restarted      #触发要执行的动作#测试页面准备
[root@ansible ~]# echo "<h1>playbook test file</h1>" >>/var/www/html/index.html
#配置文件准备
[root@ansible ~]# cat httpd.conf |grep ^Listen
Listen {{ http_port }}#执行playbook, 第一次执行可以加-C选项,检查写的playbook是否ok
[root@ansible ~]# ansible-playbook playbook.yml
PLAY [192.168.1.31] *********************************************************************************************
TASK [Gathering Facts] ******************************************************************************************
ok: [192.168.1.31]
TASK [create new file] ******************************************************************************************
changed: [192.168.1.31]
TASK [create new user] ******************************************************************************************
changed: [192.168.1.31]
TASK [install package] ******************************************************************************************
changed: [192.168.1.31]
TASK [config httpd] *********************************************************************************************
changed: [192.168.1.31]
TASK [copy index.html] ******************************************************************************************
changed: [192.168.1.31]
TASK [start httpd] **********************************************************************************************
changed: [192.168.1.31]
PLAY RECAP ******************************************************************************************************
192.168.1.31               : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 # 验证上面playbook执行的结果
[root@ansible ~]# ansible 192.168.1.31 -m shell -a 'ls /tmp/playtest.txt && id test02'
192.168.1.31 | CHANGED | rc=0 >>
/tmp/playtest.txt
uid=990(test02) gid=985(test02) 组=985(test02)[root@ansible ~]# curl 192.168.1.31:8088
<h1>playbook test file</h1>

Playbook的运行方式
通过ansible-playbook命令运行
格式:ansible-playbook <filename.yml> … [options] #filename.yml可以是任意路径,指定路径就可以执行

[root@ansible PlayBook]# ansible-playbook -h
#ansible-playbook常用选项:
--check  or -C    #只检测可能会发生的改变,但不真正执行操作
--list-hosts      #列出运行任务的主机
--list-tags       #列出playbook文件中定义所有的tags
--list-tasks      #列出playbook文件中定义的所以任务集
--limit           #主机列表 只针对主机列表中的某个主机或者某个组执行
-f                #指定并发数,默认为5个
-t                #指定tags运行,运行某一个或者多个tags。(前提playbook中有定义tags)
-v                #显示过程  -vv  -vvv更详细

Playbook中元素属性
主机与用户
在一个playbook开始时,最先定义的是要操作的主机和用户

---
- hosts: 192.168.1.31remote_user: root

除了上面的定义外,还可以在某一个tasks中定义要执行该任务的远程用户

tasks: - name: run df -hremote_user: testshell: name=df -h

还可以定义使用sudo授权用户执行该任务

tasks: - name: run df -hsudo_user: testsudo: yesshell: name=df -h

tasks任务列表
每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很清楚的辨别是属于哪一个task的,如果没有定义 name,action的值将会用作输出信息中标记特定的task。
每一个playbook中可以包含一个或者多个tasks任务列表,每一个tasks完成具体的一件事,(任务模块)比如创建一个用户或者安装一个软件等,在hosts中定义的主机或者主机组都将会执行这个被定义的tasks。

tasks:- name: create new filefile: path=/tmp/test01.txt state=touch- name: create new useruser: name=test001 state=present

Handlers与Notify
很多时候当我们某一个配置发生改变,我们需要重启服务,(比如httpd配置文件文件发生改变了)这时候就可以用到handlers和notify了;
(当发生改动时)notify actions会在playbook的每一个task结束时被触发,而且即使有多个不同task通知改动的发生,notify actions知会被触发一次;比如多个resources指出因为一个配置文件被改动,所以apache需要重启,但是重新启动的操作知会被执行一次。

[root@ansible ~]# cat httpd.yml
#用于安装httpd并配置启动
---
- hosts: 192.168.1.31remote_user: roottasks:- name: install httpdyum: name=httpd state=installed- name: config httpdtemplate: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: start httpdservice: name=httpd state=startedhandlers:- name: restart httpdservice: name=httpd state=restarted#这里只要对httpd.conf配置文件作出了修改,修改后需要重启生效,在tasks中定义了restart httpd这个action,然后在handlers中引用上面tasks中定义的notify。

Playbook中变量的使用
环境说明:这里配置了两个组,一个apache组和一个nginx组

[root@ansible PlayBook]# cat /etc/ansible/hosts
[apache]
192.168.1.36
192.168.1.33[nginx]
192.168.1.3[1:2]

命令行指定变量
执行playbook时候通过参数-e传入变量,这样传入的变量在整个playbook中都可以被调用,属于全局变量

[root@ansible PlayBook]# cat variables.yml
---
- hosts: allremote_user: roottasks:- name: install pkgyum: name={{ pkg }}#执行playbook 指定pkg
[root@ansible PlayBook]# ansible-playbook -e "pkg=httpd" variables.yml

命令行指定变量
执行playbook时候通过参数-e传入变量,这样传入的变量在整个playbook中都可以被调用,属于全局变量

[root@ansible PlayBook]# cat variables.yml
---
- hosts: allremote_user: roottasks:- name: install pkgyum: name={{ pkg }}#执行playbook 指定pkg
[root@ansible PlayBook]# ansible-playbook -e "pkg=httpd" variables.yml

hosts文件中定义变量
在/etc/ansible/hosts文件中定义变量,可以针对每个主机定义不同的变量,也可以定义一个组的变量,然后直接在playbook中直接调用。注意,组中定义的变量没有单个主机中的优先级高。

# 编辑hosts文件定义变量
[root@ansible PlayBook]# vim /etc/ansible/hosts
[apache]
192.168.1.36 webdir=/opt/test     #定义单个主机的变量
192.168.1.33
[apache:vars]      #定义整个组的统一变量
webdir=/web/test[nginx]
192.168.1.3[1:2]
[nginx:vars]
webdir=/opt/web# 编辑playbook文件
[root@ansible PlayBook]# cat variables.yml
---
- hosts: allremote_user: roottasks:- name: create webdirfile: name={{ webdir }} state=directory   #引用变量# 执行playbook
[root@ansible PlayBook]# ansible-playbook variables.yml

playbook文件中定义变量
编写playbook时,直接在里面定义变量,然后直接引用,可以定义多个变量;注意:如果在执行playbook时,又通过-e参数指定变量的值,那么会以-e参数指定的为准。

# 编辑playbook
[root@ansible PlayBook]# cat variables.yml
---
- hosts: allremote_user: rootvars:                #定义变量pkg: nginx         #变量1dir: /tmp/test1    #变量2tasks:- name: install pkgyum: name={{ pkg }} state=installed    #引用变量- name: create new dirfile: name={{ dir }} state=directory   #引用变量# 执行playbook
[root@ansible PlayBook]# ansible-playbook variables.yml# 如果执行时候又重新指定了变量的值,那么会已重新指定的为准
[root@ansible PlayBook]# ansible-playbook -e "dir=/tmp/test2" variables.yml

调用setup模块获取变量
setup模块默认是获取主机信息的,有时候在playbook中需要用到,所以可以直接调用。常用的参数参考

# 编辑playbook文件
[root@ansible PlayBook]# cat variables.yml
---
- hosts: allremote_user: roottasks:- name: create filefile: name={{ ansible_fqdn }}.log state=touch   #引用setup中的ansible_fqdn# 执行playbook
[root@ansible PlayBook]# ansible-playbook variables.yml

独立的变量YAML文件中定义
为了方便管理将所有的变量统一放在一个独立的变量YAML文件中,laybook文件直接引用文件调用变量即可。

# 定义存放变量的文件
[root@ansible PlayBook]# cat var.yml
var1: vsftpd
var2: httpd# 编写playbook
[root@ansible PlayBook]# cat variables.yml
---
- hosts: allremote_user: rootvars_files:    #引用变量文件- ./var.yml   #指定变量文件的path(这里可以是绝对路径,也可以是相对路径)tasks:- name: install packageyum: name={{ var1 }}   #引用变量- name: create filefile: name=/tmp/{{ var2 }}.log state=touch   #引用变量# 执行playbook
[root@ansible PlayBook]# ansible-playbook  variables.yml

Ansible 之 Playbook详解相关推荐

  1. Ansible之Playbook详解、案例

    playbook-剧本 介绍 playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活.简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已 ...

  2. Ansible 实战案例--Ansible Ad-Hoc 组件详解

    Ansible Ad-Hoc 组件详解 前言 一.命令执行 1.shell 2.command 3.remove 二.包管理 1.yum_repository 2.yum 三.服务管理模块 1.ser ...

  3. 1离线 TiDB Ansible 部署方案-详解

    一: 环境要求 Linux 操作系统版本要求 Linux 操作系统平台 版本 Red Hat Enterprise Linux 7.3 及以上 CentOS 7.3 及以上 Oracle Enterp ...

  4. Ansible Playbook详解

    Playbook playbook介绍 playbook 剧本是由一个或多个"play"组成的列表 play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的tas ...

  5. Ansible中的playbook详解

    首先简单说明一下playbook,playbook是什么呢? 根本上说playbook和shell脚本没有任何的区别,playbook就像shell一样,也是把一堆的命令组合起来,然后加入对应条件判断 ...

  6. Ansible playbook 详解

    一.playbook流程介绍 playbook是由一个或者多个"play"组成的列表 play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角 ...

  7. 自动化运维工具-----Ansible playbook详解

    目录 一.Ansible playbook简介 二.Ansible playbook使用场景 三.Ansible playbook格式 格式简介 核心元素 基本组件 variables变量 模板tem ...

  8. Ansible roles角色详解

    roles角色 角色是ansible自1.2版本引入的新特性,用于层次性.结构化地组织playbook.roles能够根据层次型结构自动装载变量文件.tasks以及handlers等.要使用roles ...

  9. Ansible常用模块详解

    Ansible常用模块 2015年底270多个模块,2016年达到540个,2018年01月12日有1378个模块,2018年07月15日1852个模块,2019年05月25日(ansible 2.7 ...

最新文章

  1. 职场与生活 八条原则 让你不再浪费时间和提高效率
  2. 地理文本处理技术在高德的演进(下)
  3. 机器学习实战10-Artificial Neural Networks人工神经网络简介(mnist数据集)
  4. 线程创建 pthread_create 中自定义参数注意事项
  5. Android:Android学习路线图
  6. 中兴V889D刷机变砖不用怕 V889D救砖教程发布【转载】
  7. 机房服务器巡视项目,年底,机房巡检不能少
  8. 13.软件架构设计:大型网站技术架构与业务架构融合之道 --- 业务意识
  9. 深入探索WebSockets
  10. 转自Alon's Blog
  11. Win10自定义安装Office2019
  12. 华为机试题(python版本)
  13. 软件的第三方CNAS测试的目的和意义以及测试内容和流程
  14. 南宁发展重点向南 五象湖标志性建筑“五象塔”落成
  15. 找不到AppData文件夹
  16. dagger2系列之Scope
  17. python远程连接mysql数据库_python远程连接MySQL数据库
  18. 理光Ricoh MP C5503 一体机驱动
  19. js简单实现div圆角
  20. 全错位排列 配对概率问题

热门文章

  1. 企业如何管理好员工?
  2. sceneflow 数据集多少张图片_快速使用 Tensorflow 读取 7 万数据集!
  3. QM-4 服务质量与QFD
  4. 如何用树莓派连接语音模块,红外模块来控制红外设备详解
  5. 天涯社区亲身案例,干货分享传统企业如何转型区块链 | 互链学院
  6. (20、21)性能测试环境搭建
  7. 全球地名中英文对照表(D)
  8. JavaScript中Textarea滚动条不能拖动的问题
  9. flutter GridView和Wrap
  10. 超块链创始人史兴国直播首秀:一位区块链技术界“扫地僧”的Web3.0世界观