002.Ansible playbook Role部署LNMP(RPM包形式)
-
前言
基于 Ansible playbook 快速构建起LNMP环境的实战的第2篇 。
1、环境描述
软件 | 版本 |
OS |
CentOS 7.4 |
Ansible |
2.4.2 (extra仓库) |
Nginx |
1.16.1(epel仓库) |
PHP |
5.4.16 |
Mysql |
5.5.64 |
节点 | 规格 | 地址 | 角色 |
node1 |
2CPU 2G |
192.168.3.175 |
Ansible管理节点及被管理节点,部署nginx |
node2 |
2CPU 2G |
192.168.3.176 |
Ansible被管理节点,部署php、mysql |
2、准备操作
1.配置YUM源
yum install epel release yum clean all && yum makecache
2.安装Ansible
yum install ansible
3.配置Ansible
修改host文件
vim /etc/hosts
192.168.3.175 node01
192.168.3.176 node02
配置免密登录
ssh-****** ssh-copy-id [email protected] ssh-copy-id [email protected]
修改inventory文件
vim /etc/ansible/hosts
[nginx]
node01
[phpmysql]
node02
[LNMP]
node01
node02
测试Ansible
ansible all -m ping
3、准备所需文件
需要用到的文件还是上一篇文章中的文件
1) phpmyadmin,phpMyAdmin-4.4.15-all-languages.tar.gz、node01-pma.sh、node02-pma.sh,config.inc.php
2)nginx,index.html ,www.jjf.com.conf
3)php-fpm,index.php,www.conf
4)mariadb,server.cnf
如果要手动生成可以参考上一篇文章"Ansible playbook部署LNMP(RPM包形式)",同样也可以通过如下连接直接获取
https://github.com/junfengjiang/
上一篇文章"Ansible playbook部署LNMP(RPM包形式)"中我们直接使用playbook部署LAMP,这种方式中相当于把ad-hoc方式的操作文档化通过playbook来描述,playbook中写成一个个 “play”,每个“play”中有不同的host(主机)和task(任务),或其他一些更复杂一些的控制逻辑或模块来完成我们的需求,然后ansbile再把我们编排好的这一个一个“play”中流程走一遍,从而达到我们所期望的结果。
这种方式一旦配置太多playbook会过于臃肿,而且所有文件都在不同的地方存放,移动管理起来也非常不方便。role的方式就相当于把这个playbook分割开来,把不同的文件和编排内容按照不同的角色先划分,然后再按照固定的组织结构去存放这些信息,使用用时只需要写一个简单入口文件调用这些角色就可以实现同样的编排效果。最重要的是管理和移动起来也非常方便,只需要了解目录的结构就知道去哪里找对应文件,只要把需要的role的文件(比如nginx)复制过去其他主机,再简单编写一个入口文件来调用这些角色就可以实现编排。
所以我们这次的组织结构和上一篇文章就有所不同了
准备role需要的目录
首先要按照特定的格式去组织目录,先定义三个role并创建必要目录结构
cd /etc/ansible/roles
mkdir -pv /etc/ansible/roles/{nginx,php,mysql}/{tasks,files,templates,meta,handlers,vars,default}
准备nginx需要的文件
cp /ansible/{index.html,jjf.conf,node01-pma.sh,config.inc.php,phpMyAdmin-4.4.15-all-languages.tar.gz} /etc/ansible/roles/nginx/files/
注意:这里的环境是已经把前面描述中需要的文件放到 /ansible/ 目录下,后面的步骤也是一样就直接从/ansible/ 进行复制了
准备php所需要的文件
cp /ansible/{index.php,www.conf,node02-pma.sh,config.inc.php,phpMyAdmin-4.4.15-all-languages.tar.gz} /etc/ansible/roles/php/files/
准备mysql所需要的文件
cp /ansible/server.cnf /etc/ansible/roles/mysql/files/
编写nginx任务列表
/etc/ansible/roles/nginx/tasks/main.yaml 是用于定义nginx的任务列表,也就是分割开来后nginx要执行的task
vim /etc/ansible/roles/nginx/tasks/main.yaml
- name: install epel
yum: name=epel-release state=latest
- name: install nginx
yum: name=nginx state=latest- name: mkdir nginx root dir
shell: mkdir -pv /data/nginx/html
- name: copy nginx homepage
copy: src=phpMyAdmin-4.4.15-all-languages.tar.gz dest=/data/nginx/html/
- name: copy phpmyadmin config file
copy: src=phpMyAdmin-4.4.15-all-languages.tar.gz dest=/data/nginx/html/
- name: tar zxvf phpMyAdmin-4.4.15-all-languages.tar.gz
shell: tar zxvf /data/nginx/html/phpMyAdmin-4.4.15-all-languages.tar.gz -C /data/nginx/html/
- name: copy pma.sh
copy: src=node01-pma.sh dest=/data/nginx/html/
- name: bash pma.sh
shell: bash /data/nginx/html/node01-pma.sh
- name: copy config inc php
copy: src=config.inc.php dest=/data/nginx/html/pma/
- name: copy nginx config jjf.conf
copy: src=jjf.conf dest=/etc/nginx/conf.d
- name: start nginx service
service: name=nginx state=restarted
编写php任务列表
同样也是分割开来后php要执行的task
vim /etc/ansible/roles/php/tasks/main.yaml
- name: install epel
yum: name=epel-release state=latest
- name: install php
yum: name={{ item }} state=latest
with_items:
- php-fpm
- php-mysql
- php-mbstring
- php-mcrypt
- name: mkdir /var/lib/php/session
shell: mkdir -pv /var/lib/php/session/ && chown apache:apache /var/lib/php/session/
- name: copy www.conf
copy: src=www.conf dest=/etc/php-fpm.d/
- name: start php-fpm
service: name=php-fpm state=restarted
- name: copy phpmyadmin config
copy: src=phpMyAdmin-4.4.15-all-languages.tar.gz dest=/appadata/
- name: tar zxvf phpMyAdmin-4.4.15-all-languages.tar.gz
shell: tar zxvf /appdata/phpMyAdmin-4.4.15-all-languages.tar.gz -C /appadta/
- name: copy pma.sh
copy: src=node02-pma.sh dest=/appdata
- name: bash pma.sh
shell: bash /appdata/node02-pma.sh
- name: copy config.inc.php
copy: src=config.inc.php dest=/appdata/pma/
- name: copy config index.php
copy: src=index.php dest=/appdata/
tags: copyindexphp
编写mysql任务列表
- name: install mysql
yum: name=mariadb-server state=latest
- name: copy mariadb config
copy: src=server.cnf dest=/etc/my.cnf.d/
- name: start mysql
service: name=mariadb state=restarted
4、编写playbook
提供一个入口文件lnmp_role.yaml
vim lnmp_role.yaml- hosts: node01
remote_user: root
roles:
- nginx
- hosts: node02
remote_user: root
roles:
- php
- mysql
playbook就变得非常简单,只需要指明那些host调用那些role即可,代码重用的思想也可以在这里体现
5、运行playbook
语法检查
ansible-playbook --syntax-check lnmp.yaml
dryrun测试一下
ansible-playbook -C lnmp.yaml
执行playbook
ansible-playbook lnmp.yaml
6、验证结果
测试nginx安装情况
测试php安装情况
最后测试phpmyadmin安装情况
phpmyadmin默认情况下,如果mysql的root为空是拒绝登录的。如果需要登录root需要有密码
mysqladmin -u root -p password '你的密码'
设置root密码后可以登录到web界面上,查看验证我们LAMP的各种版本信息