通过Playbook部署LAMP
Ansible的PlayBook文件格式为YAML语言,所以希望你在编写PlayBook前对YAML语法有一定的了解,否则在运行PlayBook的时候经常碰到语法错误提示,这里我们通过介绍批量部署LAMP为例,介绍一下LAMP.yml这个PlayBook的具体应用写法,如果你对YAML语言没有了解的话,请自行去百度学习.
创建准备环境
首先,我们有两台虚拟机192.168.10.20 and 192.168.10.30 这两台虚拟机,下面我们将写一个剧本实现批量部署LAMP环境,在这之前我们需要先创建SSH密钥对并分发到每一台的主机上去.
[root@localhost ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:xZxM9bunwBsS03gGT5HGT4LvOnJHdr5Bwl/Iit7qQN8 root@localhost.localdomain
The keys randomart image is:
+---[RSA 2048]----+
| .+o. |
| =..=o. |
| Bo.+. |
| . B...o |
| S +.B = .|
| . . O+=.o |
| . ++Eo+ .|
| .o+o.+.+ |
| +++o o. |
+----[SHA256]-----+
[root@localhost ~]# ssh-copy-id root@192.168.10.20
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 192.168.10.20 (192.168.10.20) can t be established.
ECDSA key fingerprint is SHA256:2kWFaV72YVvAl2EU2Zop4uAjP3Gy2jW92d0Va/HrSMM.
ECDSA key fingerprint is MD5:fc:6c:91:b0:02:e6:7e:98:52:af:0d:b3:47:d4:69:ef.
Are you sure you want to continue connecting (yes/no)? yes
root@192.168.10.20 s password:
[root@localhost ~]# ssh-copy-id root@192.168.10.30
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 192.168.10.30 (192.168.10.30) cant be established.
ECDSA key fingerprint is SHA256:2kWFaV72YVvAl2EU2Zop4uAjP3Gy2jW92d0Va/HrSMM.
ECDSA key fingerprint is MD5:fc:6c:91:b0:02:e6:7e:98:52:af:0d:b3:47:d4:69:ef.
Are you sure you want to continue connecting (yes/no)? yes
root@192.168.10.30's password:
其次创建一个目录用于存放剧本中需要用到的数据文件等,这里我们只创建两个index文件,用于后期的测试,如果你有一些配置文件需要拷贝,此时应该提前准备好.
[root@localhost ~]# mkdir playbook
[root@localhost ~]# ls -lh
total 0
drwxr-xr-x. 2 root root 6 Dec 3 10:44 playbook
[root@localhost ~]# cd playbook/
[root@localhost playbook]# ls -lh
total 8.0K
drwxr-xr-x. 2 root root 6 Dec 3 10:46 apache
drwxr-xr-x. 2 root root 6 Dec 3 10:46 mariadb
drwxr-xr-x. 2 root root 6 Dec 3 10:46 php
-rw-r--r--. 1 root root 30 Dec 3 10:45 index.html
-rw-r--r--. 1 root root 29 Dec 3 10:46 index.php
[root@localhost playbook]# cat index.html
hello lyshark
www.mkdirs.com
[root@localhost playbook]# cat index.php
<?php
phpinfo();
?>
接着创建一个用户主机列表,这里我们就在当前目录下创建一个Hosts文件即可,如果有很多太主机可以使用简写.
[root@localhost playbook]# vim hosts
[root@localhost playbook]# cat hosts
[lamp]
192.168.10.20
192.168.10.30
#[test] #此处注释,只做说明,定义从20-100网段的主机
#192.168.10.2[0:100]
## 编写Apache安装过程
这里由于我们是第一次编写剧本,所有我们应该先创建一个文件,编写一个main.yml剧本,我们来写一个安装apache软件的剧本,先来看一下这个PlayBook的部分代码:
---
- hosts: lamp
tasks:
- name: Yum install httpd
yum: name={{item}} state=installed
with_items:
- apr
- apr-util
- httpd
- httpd-devel
- name: copy index.html
template: src=./index.html dest=/var/www/html/index.html owner=root group=root mode=0755
- name: copy index.php
template: src=./index.php dest=/var/www/html/index.php owner=root group=root mode=0755
notify: #上一个命令执行成功,才会执行notify
- start httpd
handlers:
- name: start httpd
service: name=httpd state=restarted
第一项:hosts指定哪些主机执行操作,此处我们将主机列表规划成了lamp组,也就是说LAMP组成员都会执行.
第二项:tasks是应用yum模块来安装apache服务程序包,name是说明信息,说明这个模块的功能.
第四项:with_items是一个迭代器,用来批量安装以下列出的包文件,此处就是apache的相关文件.
第五项:template是一个远程复制模块,目的是将当前目录下的index配置文件复制到远程主机上去.
第六项:notify发送消息的作用,这里目的是发送给名称是start httpd的handlers让其执行操作.
这里有个注意的地方就是关于上方写了两个Copy才完成了复制,其实我们可以把它们放入一个迭代器里,代码如下:
- name: copy index.html and index.php
copy: src={{item.src}} dest={{item.dest}} owner=root group=root mode=644
with_items:
- {src: ./index.html,dest:/var/www/html/index.html}
- {src: ./index.php,dest:/var/www/html/index.php}
接着写完了这些配置以后,我们运行下面的几条命令,检查一下上面的文件是否有语法错误,和检查主机列表是否生效了.
[root@localhost playbook]# ansible-playbook -i hosts main.yml --syntax-check
playbook: main.yml
[root@localhost playbook]# ansible-playbook -i hosts main.yml --list-task
playbook: main.yml
play #1 (lamp): lamp TAGS: []
tasks:
yum install httpd TAGS: []
copy index.html TAGS: []
copy index.php TAGS: []
[root@localhost playbook]# ansible-playbook -i hosts main.yml --list-hosts
playbook: main.yml
play #1 (lamp): lamp TAGS: []
pattern: [u'lamp']
hosts (2):
192.168.10.20
192.168.10.30
## 编写MariaDB安装过程
接下来我们,继续编辑main.yml剧本,写一个安装mariadb数据库的剧本,由于无需规范化,所以我们就把他们写在一个剧本里就可以了,先来看一下这个PlayBook的部分代码:
- hosts: lamp
tasks:
- name: install mariadb
yum: name={{item}} state=installed
with_items:
- mariadb
- mariadb-server
notify:
- start mariadb
- name: set mysql password
shell: mysql -e "set password for root@localhost=password('123123');"
handlers:
- name: start mariadb
service: name=mariadb state=restarted
上图的例子,我们在安装Mariadb数据库时,可以使用shell模块直接赋值初始密码,也可以使用下面声明变量并调用mysql_user系统模块完成数据库密码的设置,需要注意的是,如果使用系统模块的话,被控主机必须安装MySQL-python包.
- hosts: lamp
vars:
- username: root #这里声明两个变量
- password: 123123
tasks:
- name: install mariadb
yum: name={{item}} state=installed
with_items:
- mariadb
- mariadb-server
- MySQL-python #如果要使用MySQL函数,这里需要安装这个包
notify:
- start mariadb
# - name: set mysql password
# shell: mysql -e "set password=password('123123');"
- name: set mysql password #这里使用两个变量来赋值
mysql_user: name={{username}} password={{password}} priv=*.*:ALL host='localhost' state=present
handlers:
- name: start mariadb
service: name=mariadb state=restarted
写完了这些配置以后,我们运行下面的几条命令,检查一下上面的文件是否有语法错误,和检查主机列表是否生效了.
[root@localhost playbook]# ansible-playbook -i hosts main.yml --syntax-check
playbook: main.yml
[root@localhost playbook]# ansible-playbook -i hosts main.yml --list-task
playbook: main.yml
play #1 (lamp): lamp TAGS: []
tasks:
yum install httpd TAGS: []
copy index.html TAGS: []
copy index.php TAGS: []
[root@localhost playbook]# ansible-playbook -i hosts main.yml --list-hosts
playbook: main.yml
play #1 (lamp): lamp TAGS: []
pattern: [u'lamp']
hosts (2):
192.168.10.20
192.168.10.30
## 编写PHP环境安装过程
最后编辑main.yml剧本,来写一个安装PHP的剧本,先来看一下这个PlayBook的部分代码:
- hosts: lamp
tasks:
- name: install PHP
yum: name={{item}} state=installed
with_items:
- php
- php-mysql
notify:
- start apache
handlers:
- name: start apache
service: name=apache state=restarted
写完了这些配置以后,我们运行下面的几条命令,检查一下上面的文件是否有语法错误,和检查主机列表是否生效了.
[root@localhost playbook]# ansible-playbook -i hosts main.yml --syntax-check
playbook: main.yml
[root@localhost playbook]# ansible-playbook -i hosts main.yml --list-task
playbook: main.yml
play #1 (lamp): lamp TAGS: []
tasks:
yum install httpd TAGS: []
copy index.html TAGS: []
copy index.php TAGS: []
[root@localhost playbook]# ansible-playbook -i hosts main.yml --list-hosts
playbook: main.yml
play #1 (lamp): lamp TAGS: []
pattern: [u'lamp']
hosts (2):
192.168.10.20
192.168.10.30
## 将剧本合并起来并执行
将剧本串联起来,然后我们在最后再次添加以下内容,目的是关闭防火墙,关闭SELinux,重启http服务.
- hosts: lamp
tasks:
- name: check iptables
shell: iptables -F
- name: check selinux
shell: setenforce 0
- name: restart httpd
shell: systemctl restart httpd
最后我们得到了,整个LAMP的剧本安装过程,完整代码如下所示:
[root@localhost playbook]# cat main.yml
---
- hosts: lamp
tasks:
- name: yum install httpd
yum: name={{item}} state=installed
with_items:
- apr
- apr-util
- httpd
- httpd-devel
- name: copy index.html
template: src=./index.html dest=/var/www/html/index.html owner=root group=root mode=0755
- name: copy index.php
template: src=./index.php dest=/var/www/html/index.php owner=root group=root mode=0755
notify:
- Start httpd
handlers:
- name: Start httpd
service: name=httpd state=restarted
#-------------------------------------------------------------------
- hosts: lamp
tasks:
- name: install mariadb
yum: name={{item}} state=installed
with_items:
- mariadb
- mariadb-server
notify:
- start mariadb
- name: set mysql password
shell: mysql -e "set password for root@localhost=password('123123');"
handlers:
- name: start mariadb
service: name=mariadb state=restarted
#-------------------------------------------------------------------
- hosts: lamp
tasks:
- name: install PHP
yum: name={{item}} state=installed
with_items:
- php
- php-mysql
# notify:
# - start apache
# handlers:
# - name: start apache
# service: name=apache state=restarted
#-------------------------------------------------------------------
- hosts: lamp
tasks:
- name: check iptables
shell: iptables -F
- name: check selinux
shell: setenforce 0
- name: restart httpd
shell: systemctl restart httpd
接着我们执行检测程序,检查整体是否有语法错误.
[root@localhost playbook]# ansible-playbook -i hosts main.yml --syntax-check
playbook: main.yml
[root@localhost playbook]# ansible-playbook -i hosts main.yml --list-task
playbook: main.yml
play #1 (lamp): lamp TAGS: []
tasks:
yum install httpd TAGS: []
copy index.html TAGS: []
copy index.php TAGS: []
[root@localhost playbook]# ansible-playbook -i hosts main.yml --list-hosts
playbook: main.yml
play #1 (lamp): lamp TAGS: []
pattern: [u'lamp']
hosts (2):
192.168.10.20
192.168.10.30
执行剧本: 确认过以后,直接使用下面的命令一键部署,我们写好的PlayBook剧本,此时我们等它一会.
[root@localhost playbook]# ansible-playbook -i hosts main.yml
PLAY [lamp] ******************************************************************************
TASK [Gathering Facts] *******************************************************************
ok: [192.168.10.30]
ok: [192.168.10.20]
....省略....
PLAY RECAP *******************************************************************************
192.168.10.20 : ok=5 changed=4 unreachable=0 failed=0
192.168.10.30 : ok=5 changed=4 unreachable=0 failed=0
最后说明,本小结内容通过一个简单案例介绍如何利用 Ansiblc 部署 LAMP 架构,这是 Ansible 在构建集群甚至跨机器部署上面的人门案例,通过本章案例可以清晰地了解到如何用 Ansible 在配置部署过程中实现一个业务逻辑架构,这也是我们在实际工作作中经常遇到的,随着公司业务的扩张,会有很多需要维护和部署的集群架构,而这些繁复的下作对于 Ansible 来说易如反掌.
参考文献:《Ansible自动化运维:技术与最佳实践》
通过Playbook部署LAMP的更多相关文章
- 通过PlayBook部署Zabbix
编写Linux初始化剧本 初始化剧本环节,主要用户实现关闭Selinux关闭防火墙,一起配置一下阿里云的YUM源地址,和安装EPEL源,为后期的zabbix安装做好铺垫工作. 1.在安装Zabbix之 ...
- 部署lamp服务器
系统:CentOS 6.5 64位 1.卸载旧版本软件 rpm -qa | grep mysql #查询是否已经安装MySQL,如有执行下面的操作将其全部删除 rpm -e mysql --nodep ...
- mint上部署lamp环境
不得不说现在在linux mint上部署lamp很方便,比windows服务器上的asp.net的部署升级都简单. 1 安装MySql sudo apt-get install mysql-serve ...
- 部署LAMP+NFS实现双Web服务器负载均衡
一.需求分析 1.前端需支持更大的访问量,单台Web服务器已无法满足需求了,则需扩容Web服务器: 2.虽然动态内容可交由后端的PHP服务器执行,但静态页面还需要Web服务器自己解析,那是否意味着多台 ...
- 云服务器 ECS > 建站教程 > 部署 LAMP (CentOS 7.2 ,Apache版本:2.4.23, Mysql 版本:5.7.17 , Php版本:7.0.12)
云服务器 ECS > 建站教程 > 部署 LAMP (CentOS 7.2) 部署 LAMP (CentOS 7.2) 文档提供方:上海驻云信息科技有限公司 更新时间:2017-06 ...
- CentOS6系统编译部署LAMP(Linux, Apache, MySQL, PHP)环境
我们一般常规的在Linux服务器中配置WEB系统会用到哪种WEB引擎呢?Apache还是比较常用的引擎之一.所以,我们在服务器中配置LAMP(Linux, Apache, MySQL, PHP)是我们 ...
- rhel6+apache2.4+mysql5.7+php5.6部署LAMP架构
rhel6+apache2.4+mysql5.7+php5.6部署LAMP架构 2017年10月01日 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~准备阶段~~~~~~~~~~~~~ ...
- 部署 LAMP
部署 LAMP https://help.aliyun.com/document_detail/50774.html?spm=a2c4g.11186623.6.773.Em8xVc 文档提供方:上海驻 ...
- Linux学习笔记之阿里云ECS部署LAMP环境
LAMP指Linux+Apache+MySQL/MariaDB+Perl/PHP/Python,是一组常用来搭建动态网站或者服务器的开源软件.它们本身都是各自独立的程序,但是因为常被放在一起使用,拥有 ...
随机推荐
- Django的JWT机制工作流程
https://blog.csdn.net/bin_1022/article/details/81278513 django-rest-framework-jwt token 怎么解码得到用户名? d ...
- 【译】OkHttp3 拦截器(Interceptor)
一,OkHttp 拦截器介绍(译自官方文档) 官方文档:https://github.com/square/okhttp/wiki/Interceptors 拦截器是 OkHttp 提供的对 Http ...
- Alpha冲刺(3/6)
队名:new game 组长博客:戳 作业博客:戳 组员情况 鲍子涵(队长) 燃尽图 过去两天完成了哪些任务 才两天,也就是实现一些功能而已 复习 接下来的计划 实现更多的功能 为下周的比赛准备 还剩 ...
- Web存储机制—sessionStorage,localStorage使用方法
Web存储机制,在这里主要聊有关于Web Storage API提供的存储机制,通过该机制,浏览器可以安全地存储键值对,比使用cookie更加直观.接下来简单的了解如何使用这方面的技术. 基本概念 W ...
- koa 基础(二十)nodejs 操作mongodb数据库 --- 新增数据
1.app.js /** * nodejs 操作mongodb数据库 * 1.安装 操作mongodb * cnpm install mongodb --save * 2.引入 mongodb 下面的 ...
- PHP获取文件扩展名五种以上的方法和注释
在PHP面试中或者考试中会有很大几率碰到写出五种获取文件扩展名的方法,下面是我自己总结的一些方法 $file = ‘需要进行获取扩展名的文件.php’; //第一种,根据.拆分,获取最后一个元素的值f ...
- GitHub:Tencent
ylbtech-GitHub:Tencent 1.返回顶部 1. https://opensource.tencent.com/ 2. 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶 ...
- Js实现京东无延迟菜单效果(demo) 慕课网
先来理清思路:1.开发基本的菜单结构 2.开发普通的二级菜单效果 3.假如延迟解决移动问题 切换子菜单时候,用setTimeout设置延迟 debounce去抖技 在事件被频繁触发是,只执行一次处理 ...
- 阶段3 3.SpringMVC·_06.异常处理及拦截器_3 SpringMVC异常处理之异常处理代码编写
分三步 新建exception的包.然后添加SysException类 一般写异常都继承.Exception 定义Messgae属性,生成get和set 生成带参数的构造方法 选中异常的代码 Ctrl ...
- 使用构造器模式动态构建Map作为mybatis的查询条件
import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.databind.ObjectMapper; import com.fas ...