Linux企业级——Ansible-playbook的简介及应用
1.playbook(剧本)的介绍
1.1 简介
playbook是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。
1.2 核心元素
Tasks:任务,由模板定义的操作列表
Variables:变量
Templates:模板,即使用模板语法的文件
Handlers:处理器 ,当某条件满足时,触发执行的操作
Roles:角色
1.3 主要组成部分的介绍
1.3.1 hosts和users
在playbook中的每一个play都可以选择在哪些服务器和以什么用户完成,hosts一行可以是一个主机组、主机、多个主机,中间以冒号分隔,可使用通配模式。
1.3.2 Tasks(任务)
1.Play的主体部分是tasks列表,tasks列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。在运行playbook时(从上到下执行),如果一个host执行tasks失败,整个tasks都会回滚,修正playbook中的错误,然后重新执行即可。Tasks的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行时幂等的,这意味着多次执行是安全的,因为其结果一致。
2.每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。
3.定义一个task,常见的格式:”module: options” 例如:yum: name=httpd
4.ansible的自带模块中,command模块和shell模块无需使用key=value格式
1.3.3 Handlers(触发器)
1.handlers也是一些task的列表,和一般的task并没有什么区别。
2.是由通知者进行的notify,如果没有被notify,则Handlers不会执行,假如被notify了,则Handlers被执行
3.不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次
1.3.4 Templates(模板)
Jinja是基于Python的模板引擎。template类是Jinja的另一个重要组件,可以看作一个编译过的模块文件,用来生产目标文本,传递Python的变量给模板去替换模板中的标记。
2.playbook的实际应用
实验环境:
虚拟机名称 | ip | 版本 | 角色 |
server1 | 172.25.66.1 | 7.5 | ansible |
server2 | 172.25.66.2 | 7.5 | 远程主机hosts |
server3 | 172.25.66.3 | 7.5 | 远程主机hosts |
前期准备:
vim .vimrc #编辑.vimrc文件,设定缩进
autocmd FileType yaml setlocal ai ts=2 sw=2 et #设定Tab为两个空格
2.1 安装apache服务
2.1.1 编写inventory主机文件
vim /home/devops/ansible/hosts #编辑组文件
[localhost]
172.25.66.1
[test]
172.25.66.2
[db]
172.25.66.3
[webserver:children]
test
db
[webserver:vars]
http_port=80
2.1.2 配置文件
在server2安装httpd服务:
yum install httpd -y
从server2给server1发送httpd.conf文件:
scp /etc/httpd/conf/httpd.conf devops@server1:/home/devops/ansible/apache
添加默认发布文件index.html:
vim index.html
2.1.3 创建playbook文件install.yml
mkdir /home/devops/ansible/apache #创建一个目录,将所有文件放到一起
cd apache #进入apache目录
vim install.yml #编辑yml文件
---
- hosts: test
vars: #定义变量,只有组文件中的test组主机可使用
- http_port: 80 #端口为80
tasks: #定义任务
- name: install apache #安装apache
yum:
name: httpd
state: present
- name: config apache #配置apache
template:
src: /home/devops/ansible/apache/httpd.conf.j2 #j2模板
dest: /etc/httpd/conf/httpd.conf
notify: restart apache #重启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 #重启apache服务
service:
name: httpd
state: restarted
- hosts: localhost #测试
vars:
- http_port: 80 #重新定义变量
become: false
tasks:
- name: test apache
uri:
url: http://172.25.66.2:{{ http_port }}
return_content: yes
2.1.4 修改httpd.conf.j2中的监听端口
2.1.5 执行playbook : ansible-playbook apache/install.yml
2.1.6 测试