本实验是基于前篇《云计算自动化运维——Ansible详解及inventory文件配置》实验环境下进行的,其中普通用户devops已经创建好,授权、免密都配置好了。实验在/home/devops/ansible目录下执行。
赋前篇链接:https://blog.csdn.net/CapejasmineY/article/details/103113503
一、认识playbook
1、playbook是什么?
playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。
2、playbook的核心元素
Tasks:任务,由模板定义的操作列表
Variables:变量
Templates:模板,即使用模板语法的文件
Handlers:处理器 ,当某条件满足时,触发执行的操作
Roles:角色
一、playbook语法
playbook由YMAL语言编写,以下为playbook常用到的YMAL格式:
- 文件的第一行应该以"—"三个连字符开始,表明YMAL文件的开始。
- 在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
- 大小写敏感
- 使用缩进表示层级关系(只能空格不能使用tab),我一般使用两个空格分层。
YAML支持的数据结构:
- YMAL中的列表元素以"-"开头然后紧跟着一个空格,同一个列表中的元素应该保持相同的缩进
例:
---
#一个水果列表
- Apple
- Orange
- Mango
- 一个字典是由一个简单的键:值的形式组成(这个冒号后面必须是一个空格):
---
#一位职工的信息
name: Example Develope
job: Developer
skill: Elite
- 字典也可以使用缩进形式来表示
---
#一位职工的信息
{name: Example Develope,job: Developer,skill: Elite}
三、Playbook编写实例
实验环境:
虚拟机名称 | ip | 版本 | 角色 |
---|---|---|---|
server1 | 172.25.1.1 | 7.5 | ansible |
server2 | 172.25.1.2 | 7.5 | 远程主机hosts |
server3 | 172.25.1.3 | 7.5 | 远程主机hosts |
设置编写环境:
yml文件对缩进格式要求比较严格,不得使用tab键,所有我们在devops用户家目录下编辑 .vimrc 文件,设置在yml文件中使用tab键时,tab键功能变为:缩进两个空格。方便文件中分离层级关系。
cd /home/devops
vim .vimrc
autocmd FileType yaml setlocal ai ts=2
apache服务
1、编写inventory主机文件
vim /home/devops/ansible/hosts
[localhost]
172.25.1.1
[test]
172.25.1.2
[db]
172.25.1.3
[webserver:children]
test
db
[webserver:vars]
http_port=80
2、编写install.yml文件,实现apache自动安装,及状态设置,在防火墙上添加服务,并测试。
mkdir /home/devops/ansible/apache #创建一个目录,将所有文件放到一起
cd apache
vim install.yml #编辑yml文件
---
- hosts: test
vars: #定义变量,只有次文件中test主机可使用
- http_port: 80
tasks:
- name: install apache #安装apache
yum:
name: httpd
state: present
- name: config apache #复制配置文件
template:
src: /home/devops/ansible/apache/httpd.conf.j2 #j2模板
dest: /etc/httpd/conf/httpd.conf
notify: restart apache
- name: start apache #开启apache服务
service:
name: httpd
state: started
- name: create index.html #复制默认发布文件到指定路径
copy:
src: /home/devops/ansible/apache/index.html
dest: /var/www/html/index.html
- name: start firewalld #开启防火墙
service:
name: firewalld
state: started
- name: config firewalld #防火墙配置,添加服务
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes
handlers: #触发器
- name: restart apache
service:
name: httpd
state: restarted
- hosts: localhost #测试
vars:
- http_port: 80 #重新定义变量
become: false
tasks:
- name: test apache
uri:
url: http://172.25.1.2:{{ http_port }}
return_content: yes
3、提前在某台主机上安装httpd(为选择为的server1主机),复制需要的文件到yml文件中指定的路径,并修改格式。编写默认发布文件index.html。
修改配置文件httpd.conf.j2中的监听端口,设置变量更容易修改。
4、运行并测试
测试:
5、此时yml文件及hosts文件中都定义了端口变量,并且80,那么到底是哪个起作用呢?判断优先级?
去掉文件中后边的测试语句(对实验无影响)
(1)修改install.yml文件中的变量值,设置apache监听端口为8080,并在防火墙上添加端口。
修改ia监听端口后,防火墙不能识别httpd服务,必须在防火墙上添加。
(2)运行文件并测试
(3)注释掉install.yml文件中的端口变量
(4)运行并测试结果
由上边实验可以得出结论:ansible执行yml文件时,默认会读取yml文件及hosts文件中的变量。但是yml文件中定义的变量优先级高于hosts文件,只有当yml文件中未找到变量时,才会去读取hosts文件。