文章目录
一、playbook简介
1.playbook
- Playbook:是利用YAML标记语言编写的可重复执行的任务的列表。
- 也可以这么理解,playbook 字面意思,即剧本。现实中由演员按照剧本表演;在Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。
- 运行过程: ansbile-playbook命令根据自上而下的顺序依次执行。 注意,运行时要求环境中有清单和配置文件。
- 输出信息:绿色代表执行成功,系统保持原样;黄色代表系统代表系统状态发生改变;红色代表执行失败,显示错误输出。
- 提高输出详细信息:ansible-playbook 默认输出不提供详细任务执行信息。-v 参数提供,共四个级别:
参数 | 作用 |
---|---|
-v | 显示任务结果 |
-vv | 显示任务结果和任务配置 |
-vvv | 包含关于与受管主机的连接信息 |
-vvvv | 增加连接插件相关的额外详细程度选项(包括受管主机上用于执行脚本的用户及所执行的脚本) |
2. yaml语法
- yaml 格式通常以 yml为扩展名 (xxxx.yml),yaml 对于缩进量没有严格要求,但是有两个基本原则:
(1)处于同一层次结构中同一级别的数据元素必须具有相同的缩进量
(2)如果项目属于其他项目的子项,其缩进量必须大于父项 - 编写yaml文件时,文件的第一行以 “—” (三个英文破折号)开始,表明YMAL文件的开始。以“…”(三个省略号)结束标记,通常可以省略。
- YMAL中的列表元素以 ”-”开头然后紧跟着一个空格,后面为元素内容。
- 核心元素:
hosts:主机;remoute_user: 在远程主机上执行任务的用户;tasks:任务列表;
variables: 变量;templates:包含了模板语法的文本文件;handlers:由特定条件触发的任务; - playbook中hosts,tasks等元素的表示方法都是键值中间以”:”分隔表示,”:”后面还要增加一个空格。
- playbook本身是一个键值对集合,同一playbook中的键应当使用相同的缩进量。
- yaml注释:在编写时可以在所要注释的字符前使用 “#” 直接注释掉
- yaml字符串:使用单引号或者双引号来设定字符串
例如:this is a string
'this is a string' #表示字符串
"this is a string"
二、编写和运行playbook
1. 简单的playbook示例
1.1 引入:由临时命令改写playbook
- 查看指定用户的临时命令: ansible -m user -a “name=student uid=1000 state=present” servera.lab.example.com
- 改写playbook查看指定用户:
--- #文档开始标记
- name: Configure User #name非必要,但建议使用,可以注明文档的用途
hosts: servera.lab.example.com #指定受管主机
tasks: #任务
- name: Student user #指定任务名称
user: #使用user模块
name: student #user模块参数注明用户名称,id,状态
uid: 1000
state: present
... #结束标记
1.2 示例:安装Apache
受管主机:severa.lab.example.com,在默认清单里面添加;
列出 yum 的用法和示例:ansible-doc yum;
终端中输出 yum 模块中各参数的用法: ansible-doc -s yum
注意:在使用yum模块时,要确保受管主机的yum源没有问题。
---
- name: Setup Webserver
hosts: servera.lab.example.com
tasks:
- name: Http Installed
yum: #yum模块
name: httpd #yum模块参数,name指定安装的服务名称
state: latest #state指定状态,latest表示安装最新版本
...
1.3 示例:确保服务开机启动
---
- name: Setup Webserver
hosts: servera.lab.example.com
tasks: #执行两个任务
- name: Apache is enabled
service: #service模块
name: httpd #模块参数name,enabled
enabled: true #确保httpd服务开启启动
- name: Vsftpd is enabled #同一级别的元素必须采用相同的缩进量
service:
name: vsftpd
enabled: true #确保vsftpd服务开机启动
...
2. 语法验证和空运行
- 执行playbook前最好进行语法验证,当编写出现错误时,会出现字符ERROR,提示错误位置
命令:ansible-playbook --syntax-check xxx.yml
- 执行空运行,空运行会报告执行这个 playbook 将会发生什么,但不会改变目标主机
命令:ansible-playbook -C xxx.yml
3. 示例多任务:安装、配置默认发布页并启动 apache
- 在管理主机中设定源默认发布页面文件:vim /root/html/index.html
- 创建配置文件和清单:在新建的目录里创建
- 编辑playbook: vim site.yml
---
- name: Install and Start Apache
hosts: web #指定受管主机组为web
tasks: #多任务
- name: Apache is present #检测Apache是否已经存在
yum: #不存在则安装Apache
name: httpd
state: present
- name: Change index.html #更改默认发布页面
copy: #使用copy模块
src: /root/html/index.html #源文件:从管理主机的文件中复制发布页面文件
dest: /var/www/html/index.html #目的地:复制到受管主机的默认发布文件
- name: Start Apache #开启Apache服务
service: #使用service模块
name: httpd #模块参数name,state,enable
state: started
enabled: true
...
- 语法检测:ansible-playbook --syntax-check site.yml
- 执行playbook:ansible-playbook site.yml
- 测试:测试时要关闭受管主机组的防火墙
三、实施多个playbook
示例:启动内部网服务并进行验证。
当受管主机上的火墙开启并处于enable状态,而且受管主机上没有安装Apache服务时,通过执行多剧本可以完成Apache服务的部署,可以指定并成功访问受管主机的默认发布页面内容。
- 建立配置文件和清单:
- 编辑多剧本:vim intranet.yml
---
- name: Enable intranet services ####第一个play:启动内部网服务####
hosts: web #指定主机为受管主机
become: yes #此play中提升用户身份,超级用户才有权限修改默认发布页面
tasks: #此play中有5个任务
- name: latest version of httpd and firewalld installd #检测httpd和firewalld是否安装和是否是最新版本
yum: #使用yum模块
name:
- httpd
- firewalld
state: latest
- name: test html page is configured #检测是否配置默认发布页面
copy:
content: "Welcome to Apache!" #使用content参数可以指定默认发布页面内容,字符串用双引号表示。
dest: /var/www/html/index.html
- name: firewalld enabled and running #检测防火墙是否开启并处于enable状态
service:
name: firewalld
enabled: true
state: started
- name: firewalld permits access to httpd service #检测防火墙是否允许 httpd 服务访问
firewalld: #使用firewalld模块添加httpd服务
service: http
state: enabled
permanent: true #永久添加服务
immediate: yes #立即生效
- name: httpd enabled and running #检测 httpd 是否开启和设置开机启动
service:
name: httpd
enabled: true
state: started
- name: Test intranet web server ####第二个play:在本机测试####
hosts: localhost #此play指定主机为管理主机
become: no #此play不升级用户身份
tasks:
- name: connect to intranet web server #测试访问 servera
uri: #使用uri模块
url: http://servera.lab.example.com #使用url参数获取链接
return_content: yes #是否返回页面内容
status_code: 200 #状态码为200表示成功
- 语法检测:ansible-playbook --syntax-check intranet.yml
- 执行:ansible-playbook intranet.yml
- 验证:访问servera