Ansible PlayBook 实战入门
# Ansible PlayBook 实战入门
# 掌握要点
(1)掌握 Ansible PlayBook 的语法。
(2)了解 PlayBook 与 Shell 脚本的差异。
(3)熟练使用 PlayBook 部署服务。
# 节点规划
IP | 主机名 | 节点 |
---|---|---|
192.168.200.11 | ansible | Ansible 节点 |
192.168.200.12 | node1 | Node 节点 |
# PlayBook 语法介绍
(1)YAML 语言介绍
PlayBook 是由一个或多个“play”组成的列表。 play 的主要功能在于将事先归并为一组的主机装扮成事先通过 Ansibe 中的 Task 定义好的角色。从根本上来讲,所谓 Task 无非是调用 Ansible 的 module。将多个 play 组织在一个 PlayBook 中,即可让它们联同起来按事先编排的机制运行。
PlayBook 由 YMAL 语言编写。YAML 是一个可读性高的用来表达资料序列的格式。YAML 参考了其他多种语言,包括 XML、C 语言、Python、Perl 以及电子邮件格式 RFC2822 等。
YAML Ain't Markup Language,即 YAML 不是 XML。不过,在开发这种语言时,YAML 的意思其实是“Yet Another Markup Language”(仍是一种标记语言)。其特性和格式如下:特性:
⚫YAML 的可读性好;
⚫YAML 和脚本语言的交互性好;
⚫YAML 使用实现语言的数据类型;
⚫YAML 有一个一致的信息模型;
⚫YAML 易于实现;
⚫YAML 可以基于流来处理;
⚫YAML 表达能力强,扩展性好。
格式:
example
|--group_vars/
|--all
|--roles/
|--install
|--tasks
|--main.yaml
|--install.yaml
|--deploy.json
(2)YMAL 基本语法以一个简单的 PlayBook 为例,说明 YAML 的基本语法。
---
- hosts: hosts #指定主机
remote_user: root #指定在被管理的主机上执行任务的用户
tasks: #任务列表
- name: disable selinux #任务名关闭防火墙
command: '/sbin/seletenforce 0' #调用command模块 执行关闭防火墙命令
- name: start httpd #任务名开启httpd
service: name=httpd state-started #调用service模块,开启httpd
⚫YAML 文件以**“---”**开头,以表明这是一个 YAML 文件,就像 XML 文件在开头使用<?xml version="1.0" encoding="utf-8"?>宣称它是 XML 文件一样。但即使没有使用---开头,也不会有什么影响。
⚫YAML 中使用“#”作为注释符,可以注释整行,也可以注释行内从**“#”**开始的内容。
# PlayBook与Shell脚本差异
(1)Shell 脚本与 PlayBook 的转换
传统的部署方式是通过编写 Shell 脚本在主机上运行部署任务,这种方式也是目前很多团队的现状。但鉴于Ansible的优势,越来越多的团队开始采用Ansible 来实现 DevOps,因此需要将现有的 Shell 脚本修改为 Ansible 的 PlayBook,可以使用以下 2 种方法:
1.Shell 脚本与 PlayBook 的转换如下是一个安装 Apache 的 Shell 脚本:
#!/bin/bash
# 进入相应目录下载应用包
cd /usr/local/devcloud/apache-tomcat-7.0.61/webapps/ wget $app_url
# 设置权限
chmod 755 TempTest-Tomcat_war.war
# 启动 Apache,并设置开机启动
service tomcat start
转换为一个完整的 PlayBook 后:
将以下内容放在 main.yaml 文件中,创建一个 PlayBook 即可运行,运行结果和脚本运行结果一致。
---
- name: 下载应用包
copy: src={{app_url}}/tomcat/TempTest-Tomcat_war.war dest=/usr/local/devcloud/apache-tomcat-7.0.61/webapps/ mode=755
- name: 启动 Tomcat
service: name=tomcat state=started enabled=yes
2.使用 PlayBook 调用 Shell 脚本如果现有的 Shell 脚本过于复杂,改为 PlayBook 耗时较长,可以编写简单的PlayBook 去调用现有的 Shell 脚本,如下:
---
- name: mkdir /tmp/test
file: path=/tmp/test state=directory mode=0755
- name: copy install.sh
template: src=install.sh dest=/tmp/test/
- name: excute install.sh
command: chdir=/tmp/test sh install.sh
以上 PlayBook 流程如下:
在“file”模块创建一个临时目录“/tmp/test”。然后使用“template”模块将现有的 shell 脚本“install.sh”复制到“/tmp/test”。最后用“command”来执行这个 shell 脚本。
(2)Shell 脚本与 PlayBook 的差异
当把 Shell 脚本转换为 Ansible PlayBook 运行的时候,Ansible 会留下清晰的执行痕迹,明确告诉运维人员在每一台主机上的每一步都做了什么。同时,Ansible 自带幂等判断机制也为运维省去不少伤脑筋费心的人脑逻辑判断运算。当重复执行一个 PlayBook 时,当 Ansible 发现系统的现有状态与 PlayBook 所定义的将要实现的状态一致时,Ansible 将自动跳过该操作。再次执行 PlayBook,当 Ansible 发现 PlayBook 中的 play 都已完成时,它将直接返回 OK 状态码,速度非常之快。如果是 Shell 脚本,肯定会把所用操作再做一遍。
在正式运行 PlayBook 之前,可以使用--check 或-C 选项来检测 PlayBook 会改变哪些内容,显示的结果跟真正执行时一模一样,但不会真的对被管理的服务器产生实际影响。
# 部署案例
使用 PlayBook 配置部署任务,以部署 HTTP 服务为例,首先需要安装 httpd 服务,然后启动 httpd 服务,完成部署。主要包括编写 PlayBook 和执行 PlayBook 两部分。
1.编写PlayBook
① 创建目录创建一个文件夹作为 PlayBook 的根目录,文件夹名称(如 example)即为PlayBook 的名称。
使用远程连接工具连接到 Ansible 节点,创建一个 example 目录,命令如下:
[root@ansible ~]# mkdir example
② 编写 install.yaml 文件
进入 example 目录,创建 install.yaml 文件,该文件是安装动作的入口文件。
[root@ansible example]# cat install.yaml
---
- hosts: hosts
remote_user: root
roles:
- httpd
说明:
hosts: hosts 和 remote_user: root 表示在 hosts 这个组执行该 PlayBook,用 root 用户的权限执行。
roles 下面的 httpd 表示执行部署脚本目录下的 roles/httpd/tasks/main.yaml 文件。
③ 编写 main.yaml 文件
编写 roles/httpd/tasks/main.yaml 文件。在 example 目录下新建 roles 目录,在 roles 目录下新建 httpd 目录,然后在 httpd 目录下新建 tasks 目录,最后在 tasks 目录下新建 main.yaml 文件。其中,httpd 目录的名称要和步骤②中 install.yaml 文件中 roles 下面定义的httpd 名称一致,其余的 roles 目录、tasks 目录和 main.yaml 的名称都是固定的。
[root@ansible example]# cat roles/httpd/tasks/main.yaml
---
- name: stop fireawlld
command: systemctl stop firewalld
- name: disable selinux
command: setenforce 0
- name: yum install httpd
yum:
name: httpd
state: present
- name: Start httpd
service:
name: httpd
state: started
enabled: yes
④ 编写 group_vars/all 文件
在 example 目录里,新建 group_vars 目录,该名称是固定的,用来存放变量声明文件。在 group_vars 目录下,新建 all 文件,这个名称也是固定的。all 文件的内容如下:
vars1: aaa
vars2: bbb
2.执行PlayBook
在执行 PlayBook 前,可以先查看该 PlayBook 执行时,哪些主机将会受到影响,使用--list-hosts 参数
[root@ansible example]# ansible-playbook install.yaml --list-hosts
playbook: install.yaml
play #1 (hosts): hosts TAGS: []
pattern: [u'hosts']
hosts (1):
192.168.100.12
执行 PlayBook 完毕后,可使用浏览器访问 node1 节点的 IP 地址,会显示 httpd 服务的测试界面