前言

在上篇博文中讲解了ansible的多个常用的模块,这些模块让ansible具有了管理,部署后端主机的能力,但是一个一个命令的执行明显很浪费时间,那么能不能有一个文件类似于shell脚本那样可以把复杂的、重复的命令,简单化、程序流程化起来呢?答案是肯定的,playbook剧本就是类似于shell脚本的一个文件,不过他有自己的语法格式。

一、playbook简介

playbook就是ansible用于配置,部署和管理被控节点的一个任务列表文件,通过执行playbook中的一系列task,可以让被控主机达到预期的状态,更强大的地方在于,在 playbooks 中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤,并且可以同步或异步的发起任务。

playbook 由一个或多个 ‘plays’ 组成.它的内容是一个以 ‘plays’ 为元素的列表.在 play 之中,一组机器被映射为定义好的角色.在 ansible 中,play 的内容,被称为 tasks,即任务.在基本层次的应用中,一个任务是一个对 ansible 模块的调用。

playbook由YMAL语言编写,类似于JSON的文件格式,便于理解和阅读,同时书写也比较方便。

编写playbook需要用到的组件:Iventory file、 Moudles、actions(command)
一个完整的playbook的构成:tasks 任务、variables 变量、templates 模版、handlers 处理器、roles角色。

二、playbook配置

首先我把官网给提供的playbook拿过来结合它介绍一下语法格式。(这个playbook中只有一个play)

# 文件第一行以 --- 开头表示YMAL文件开始(文件中 # 之后内容表示注释,和shell一样)
---
# hosts 行的内容是一个或多个组或主机的 patterns,以逗号为分隔符,
- hosts: webservers
# vars用来定义变量vars:http_port: 80max_clients: 200
# remote_user 就是用户名remote_user: root
# task 下面是任务列表tasks:
# 使用yum模块进行操作- name: ensure apache is at the latest versionyum: pkg=httpd state=latest- name: write the apache config filetemplate: src=/srv/httpd.j2 dest=/etc/httpd.conf
# 定义一个触发器notify:- restart apache- name: ensure apache is runningservice: name=httpd state=started
# 和上面定义的触发器对应,当触发器被触发时执行下面的操作handlers:- name: restart apacheservice: name=httpd state=restarted
注意:
1.YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。
2.同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。
3.play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以":"分隔表示,":"后面还要增加一个空格。

关于用户

  1. 可以在每个task中定义自己的远程用户
---
- hosts: webserversremote_user: roottask:- name: test connectionping:remote_user: Dong
  1. 也支持从sudo执行命令
---
- host: webserversremote_user: cx55887sudo: yes
# 同样,也可以在一个task中使用sudo执行命令,而不是在整个play中使用sudu
---
- host: webserverremote_user: cx55887tasks: - service: name=nginx state=startsudo: yes

如果你需要在使用 sudo 时指定密码,可在运行 ansible-playbook 命令时加上选项 --ask-sudo-pass (-K). 如果使用 sudo 时,playbook 疑似被挂起,可能是在 sudo prompt 处被卡住,这时可执行 Control-C 杀死卡住的任务,再重新运行一次.

tasks列表

每一个 play 包含了一个 task 列表(任务列表).一个 task 在其所对应的所有主机上执行完毕之后,下一个 task 才会执行。每个 task 的目标在于执行一个 moudle, 通常是带有特定的参数来执行.在参数中可以使用变量(variables)

每一个 task 必须有一个名称 name,这样在运行 playbook 时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个 task 的. 如果没有定义 name,‘action’ 的值将会用作输出信息中标记特定的 task.

下面是一种基本的 task 的定义,service moudle 使用 key=value 格式的参数,这也是大多数 module 使用的参数格式:

tasks:- name: make sure apache is runningservice: name=httpd state=running

比较特别的两个 modudle 是 command 和 shell ,它们不使用 key=value 格式的参数,而是这样:

tasks:- name: disable selinuxcommand: /sbin/setenforce 0

使用 command module 和 shell module 时,需要关心返回码信息,如果有一条命令,它的成功执行的返回码不是0, 可以样做:

tasks:- name: run this command and ignore the resultshell: /usr/bin/somecommand || /bin/true
# 或者这样也可以
tasks:- name: run this command and ignore the resultshell: /usr/bin/somecommandignore_errors: True

如果 action 行看起来太长,你可以使用 space(空格) 或者 indent(缩进) 隔开连续的一行:

tasks:- name: Copy ansible inventory file to clientcopy: src=/etc/ansible/hosts dest=/etc/ansible/hostsowner=root group=root mode=0644

在 action 行中可以使用变量.假设在 ‘vars’ 那里定义了一个变量 ‘vhost’ ,可以这样使用它:

tasks:- name: create a virtual host file for {{ vhost }}template: src=somefile.j2 dest=/etc/httpd/conf.d/{{ vhost }}

Handlers: 在发生改变时执行的操作

远端系统被人改动时,可以重放 playbooks 达到恢复的目的. playbooks 本身可以识别这种改动,并且有一个基本的 event system(事件系统),可以响应这种改动.

(当发生改动时)’notify’ actions 会在 playbook 的每一个 task 结束时被触发,而且即使有多个不同的 task 通知改动的发生, ‘notify’ actions 只会被触发一次.

举例来说,比如多个 resources 指出因为一个配置文件被改动,所以 apache 需要重新启动,但是重新启动的操作只会被执行一次.

这里有一个例子,当一个文件的内容被改动时,重启两个 services:

- name: template configuration filetemplate: src=template.j2 dest=/etc/foo.confnotify:- restart memcached- restart apache

Handlers 也是一些 task 的列表,通过名字来引用,它们和一般的 task 并没有什么区别.Handlers 是由通知者进行 notify, 如果没有被 notify,handlers 不会执行.不管有多少个通知者进行了 notify,等到 play 中的所有 task 执行完成之后,handlers 也只会被执行一次.

这里是一个 handlers 的示例:

handlers:- name: restart memcachedservice:  name=memcached state=restarted- name: restart apacheservice: name=apache state=restarted

Handlers 最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.

执行一个playbook

[root@ser1 ~]# ansible-playbook playbook.yml -f 10
# -f 10表示并行的级别 是10

在执行一个 playbook 之前,想看看这个 playbook 的执行会影响到哪些 hosts,你可以这样做:

[root@ser1 ~]# ansible-playbook playbook.yml --list-hosts

------做运维之前很矫情的小年轻-----

Ansible之playbook(剧本)介绍和配置详解相关推荐

  1. smb服务介绍及配置详解

    理论部分 samba服务简介 smb服务是微软的网络通讯协议,后来应用到了linux系统上.这款文件共享协议可以使得Linux与windows系统之间进行文件共享与打印功能,由于NFS可以完成linu ...

  2. MyBatis(一)MyBatis介绍和配置详解

    在Java程序里面去操作数据库,最原始的办法是使用JDBC的API.需要分为六步: 注册驱动 通过DriverManager获取一个Connection 通过Connection创建一个Stateme ...

  3. 华为防火墙的NAT介绍及配置详解

    一.华为防火墙NAT的六个分类 华为防火墙的NAT分类: NAT No-PAT:类似于Cisco的动态转换,只转换源IP地址,不转换端口,属于多对多转换,不能节约公网IP地址,使用情况较少. NAPT ...

  4. slf4j介绍及配置详解

    首先maven构建项目,在pom.xml中添加下面代码.<dependency><groupId>org.slf4j</groupId><artifactId ...

  5. 【笔记】spring的注解回顾,springboot-restful项目结构介绍 springboot-freemarker ⼯程配置详解

    注解 学Spring boot有一阵子了,总结一下它的注解. @Controller :修饰class,⽤来创建处理http请求的对象 @RestController :Spring4之后加⼊的注解, ...

  6. rsync的介绍及参数详解,配置步骤,工作模式介绍

    rsync的介绍及参数详解,配置步骤,工作模式介绍 rsync是类unix系统下的数据镜像备份工具.它是快速增量备份.全量备份工具. Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主 ...

  7. keepalived介绍、安装及配置详解

    文章目录 keepalived简介 keeplived和LVS关系 VRRP工作原理 keepalived体系结构及工作原理 keepalived安装 keepalived配置详解 keepalive ...

  8. Log4j介绍,log4j.properties配置详解

    http://www.cnblogs.com/simle/archive/2011/09/29/2195341.html本文主要解释log4j的配置文件各个配置项的含义,内容是从网上转载的 1.Log ...

  9. spring mysql ssl_MySQL 使用 SSL 连接配置详解

    vsftpd配置详解 vsftpd是linux发行版中的一款ftp服务器程序它的全称是"very secure ftp daemon",号称是最安全的ftp服务器.它工作在2120 ...

最新文章

  1. DP UVALive 6506 Padovan Sequence
  2. linux中用截取一些信息,Linux如何使用cut命令截取文件信息
  3. 各类型磁盘的IOPS一览表
  4. DevExpress的对话框XtraMessageBox的使用
  5. sql数据库基础知识整理,常用函数及常用语法
  6. 算法那么重要,你还不会?ACM金牌选手教你学习数据结构与算法
  7. 服务器linux启动,Linux 服务器环境启动
  8. 《程序设计技术基础》第1-5章例程
  9. 【机器学习】算法调参
  10. 关于Angular样式封装
  11. vue el-select 默认选中
  12. Intellij IDEA如何打包jar文件?
  13. 如何启动软件YouTube频道
  14. 系统崩溃怎么重装系统Win10?
  15. rpm安装java_【CentOS】rpm包安装Jdk
  16. 微信视频号运营 1000 问
  17. ubuntu下IPv6查询相关命令
  18. JAVA读取注册表中的值
  19. 计算机事业单位结构化面试的专业题,事业单位结构化面试出题规律:组织活动类问题...
  20. 完美世界乐逍遥笔试面试

热门文章

  1. LeetCode 1:Two Sum
  2. STL学习小记--与C++模板相关的几个特性
  3. 线性方程 最小二乘解 SVD分解
  4. DM9000 寄存器的定义
  5. An Introduction To The SQLite C/C++ Interface
  6. 学计算机须知,学习计算机须知的50个专业术语
  7. for vue 一行2列_vue常见面试题汇总
  8. ConcurrentHashMap介绍
  9. linux编译两个整数相加,常考面试题之两个字符串相加(长整数相加)
  10. 数据集合 oracle,oracle集合