Ansible(三)—— 使用Ansible自动化部署LNMP环境实战指南

文章目录

  • 前言
  • 一、环境准备
    • [1.1 主机规划](#1.1 主机规划)
    • [1.2 主机清单配置](#1.2 主机清单配置)
    • [1.3 创建角色目录结构](#1.3 创建角色目录结构)
  • 二、编写Nginx角色
    • [2.1 任务(Tasks)配置](#2.1 任务(Tasks)配置)
      • [2.1.1 初始化任务](#2.1.1 初始化任务)
      • [2.1.2 主任务文件](#2.1.2 主任务文件)
    • [2.2 变量(Vars)定义](#2.2 变量(Vars)定义)
    • [2.3 处理程序(Handlers)](#2.3 处理程序(Handlers))
    • [2.4 配置文件](#2.4 配置文件)
  • 三、编写MySQL角色
    • [3.1 任务(Tasks)配置](#3.1 任务(Tasks)配置)
    • [3.2 变量(Vars)定义](#3.2 变量(Vars)定义)
  • 四、编写PHP角色
    • [4.1 任务(Tasks)配置](#4.1 任务(Tasks)配置)
    • [4.2 变量(Vars)定义](#4.2 变量(Vars)定义)
    • [4.3 处理程序(Handlers)](#4.3 处理程序(Handlers))
    • [4.4 配置文件](#4.4 配置文件)
      • [4.4.1 PHP测试页面](#4.4.1 PHP测试页面)
      • [4.4.2 PHP-FPM配置文件](#4.4.2 PHP-FPM配置文件)
  • 五、编写主剧本
  • 总结

前言

在当今的DevOps环境中,自动化部署已经成为提高效率和保证环境一致性的关键技术。Ansible作为一款强大的自动化运维工具,以其简单易用、无需代理的特点受到广泛欢迎。

本文将详细介绍如何使用Ansible角色(Roles)来自动化部署LNMP(Linux + Nginx + MySQL + PHP)环境,实现一键式部署,大大提高运维效率。

一、环境准备

1.1 主机规划

在本实践中,我们使用以下主机环境:

  • 192.168.10.22 - Ansible控制节点
  • 192.168.10.14 - Web服务器,准备安装Nginx
  • 192.168.10.15 - 数据库服务器,准备安装MySQL
  • 192.168.10.16 - PHP服务器,准备安装PHP

1.2 主机清单配置

首先需要在Ansible控制节点上配置主机清单文件:

bash 复制代码
vim /etc/ansible/hosts

[webservers]
192.168.10.14

[dbservers]
192.168.10.15

[phpservers]
192.168.10.16

1.3 创建角色目录结构

Ansible角色采用标准的目录结构,便于管理和维护:

bash 复制代码
# 创建nginx角色目录
mkdir /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,defaults,meta} -p

# 创建mysql角色目录
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p

# 创建php角色目录
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p

# 创建各角色的主配置文件
touch /etc/ansible/roles/nginx/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml

二、编写Nginx角色

2.1 任务(Tasks)配置

2.1.1 初始化任务

创建初始化任务文件,包含系统基础配置:

bash 复制代码
vim /etc/ansible/roles/nginx/tasks/init.yml

- name: disable selinux
  command: '/usr/sbin/setenforce 0'
  ignore_errors: true

- name: disable firewalld
  service: 
    name: firewalld 
    state: stopped 
    enabled: no

2.1.2 主任务文件

定义Nginx安装和配置的主要任务:

bash 复制代码
vim /etc/ansible/roles/nginx/tasks/main.yml

- include: init.yml
- name: install nginx repo
  yum: 
    name: "{{ repo }}" 

- name: install nginx
  yum: 
    name: "{{ app }}" 
    state: latest

- name: prepare httpd configuration file
  copy: 
    src: default.conf 
    dest: /etc/nginx/conf.d/default.conf
  notify: 
    - restart nginx

- name: start nginx
  service: 
    name: "{{ svc }}" 
    state: started 
    enabled: yes

2.2 变量(Vars)定义

定义Nginx角色使用的变量:

bash 复制代码
vim /etc/ansible/roles/nginx/vars/main.yml

repo: http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
app: nginx
svc: nginx

2.3 处理程序(Handlers)

定义Nginx服务重启的处理程序:

bash 复制代码
vim /etc/ansible/roles/nginx/handlers/main.yml

- name: restart nginx
  service: 
    name: "{{ svc }}" 
    state: restarted

2.4 配置文件

准备Nginx的配置文件:

bash 复制代码
vim /etc/ansible/roles/nginx/files/default.conf

server {
    listen      80;
    server_name  www.simoncwh.com;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.php$ {
        root           /www;
        fastcgi_pass   192.168.10.16:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

三、编写MySQL角色

3.1 任务(Tasks)配置

定义MySQL安装和配置任务:

bash 复制代码
vim /etc/ansible/roles/mysql/tasks/main.yml

- include: init.yml
- name: install mysql repo first
  yum: 
    name: "{{ repo }}"

- name: install mysql repo second
  replace:
    path: /etc/yum.repos.d/mysql-community.repo
    regexp: '^gpgcheck=1'
    replace: 'gpgcheck=0'
  
- name: install mysql app
  yum: 
    name: "{{ app }}" 
    state: latest

- name: mysql start 
  service: 
    name: "{{ svc }}"
    state: started 
    enabled: yes

- name: first password
  shell: mysql -uroot -p"{{ passwd }}" --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'Admin@123';"

- name: sudo login
  shell: mysql -uroot -pAdmin@123 -e "grant all privileges on *.* to root@'%' identified by 'Admin@123' with grant option;"

3.2 变量(Vars)定义

定义MySQL角色使用的变量:

bash 复制代码
vim /etc/ansible/roles/mysql/vars/main.yml

repo: https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm

passwd: $(grep "password" /var/log/mysqld.log | awk '{print $NF}')

app: mysql-server
svc: mysqld

四、编写PHP角色

4.1 任务(Tasks)配置

定义PHP安装和配置任务:

bash 复制代码
vim /etc/ansible/roles/php/tasks/main.yml

- include: init.yml
- name: install php repo
  yum: 
    name: "{{ repo }}"

- name: install php app
  yum: 
    name: "{{ app }}"
  ignore_errors: true

- name: add php user
  user: 
    name: php 
    shell: /sbin/nologin

- name: create /www dir
  file: 
    path: /www 
    state: directory

- name: copy index.php
  copy: 
    src: index.php 
    dest: /www/index.php

- name: copy configuration file
  copy: 
    src: www.conf 
    dest: /etc/php-fpm.d/www.conf
  notify: 
    - reload php-fpm

- name: modify php.ini
  replace:
    path: /etc/php.ini
    regexp: ;date.timezone =
    replace: date.timezone = Asia/shanghai

- name: start php-fpm
  service: 
    name: "{{ svc }}" 
    state: started 
    enabled: yes

4.2 变量(Vars)定义

定义PHP角色使用的变量:

bash 复制代码
vim /etc/ansible/roles/php/vars/main.yml

app:
  - php72w
  - php72w-cli
  - php72w-common
  - php72w-devel
  - php72w-embedded
  - php72w-gd
  - php72w-mbstring
  - php72w-pdo
  - php72w-xml
  - php72w-fpm
  - php72w-mysqlnd
  - php72w-opcache

svc: php-fpm

repo:
  - epel-release
  - https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

4.3 处理程序(Handlers)

定义PHP-FPM服务重启的处理程序:

bash 复制代码
vim /etc/ansible/roles/php/handlers/main.yml

- name: reload php-fpm
  service: 
    name: "{{ svc }}" 
    state: restarted

4.4 配置文件

4.4.1 PHP测试页面

创建PHP测试页面,用于验证PHP与MySQL的连接:

bash 复制代码
vim /etc/ansible/roles/php/files/index.php

<?php
$link=mysqli_connect('192.168.10.15','root','Admin@123');
if($link) echo "<h1>Success!!</h1>";
else echo "Fail!!";
?>

4.4.2 PHP-FPM配置文件

配置PHP-FPM服务,确保与Nginx正常通信:

bash 复制代码
vim /etc/ansible/roles/php/files/www.conf

; 精简后的关键配置
[www]
user = php
group = php
listen = 192.168.10.16:9000
listen.allowed_clients = 192.168.10.14
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

五、编写主剧本

创建主剧本文件,编排各个角色的执行顺序:

bash 复制代码
# role_lnmp.yml
---
- hosts: webservers
  remote_user: root
  roles:
    - nginx
- hosts: dbservers
  remote_user: root
  roles:
    - mysql
- hosts: phpservers
  remote_user: root
  roles:
    - php
bash 复制代码
# 运行剧本
cd /etc/ansible
ansible-playbook role_lnmp.yml

总结

通过本文的详细介绍,我们完成了使用Ansible角色自动化部署LNMP环境的全过程。这种方法具有以下优势:

  1. 模块化设计:每个服务作为独立的角色,便于维护和复用
  2. 变量集中管理:将配置参数提取为变量,提高灵活性
  3. 任务清晰分离:初始化、安装、配置、服务管理任务分离,逻辑清晰
  4. 处理程序机制:只有在配置变更时才触发服务重启,提高效率
  5. 一键部署:通过主剧本统一调度,实现整个环境的自动化部署

这种基于Ansible角色的部署方法不仅适用于LNMP环境,还可以扩展到其他复杂应用的自动化部署中,是现代化运维工作中不可或缺的重要技能。通过不断优化和完善角色配置,可以构建出更加健壮和高效的自动化部署体系。

相关推荐
EMTime4 小时前
Docker运行OpenWRT
运维·docker·容器
lolo大魔王5 小时前
Linux 文件系统超全面详解(原理、结构、挂载、分区、inode、日志、管理命令)
linux·运维·服务器
zyl837217 小时前
Docker 使用手册
运维·docker·容器
古月方枘Fry7 小时前
MGRE实验
运维·服务器
stolentime8 小时前
FreeDomain 本地开发环境快速搭建指南
运维·服务器·网络
bush49 小时前
嵌入式linux学习记录四
linux·运维·学习
lihao lihao10 小时前
软硬链接
linux·运维·服务器
TOWE technology10 小时前
智能安防监控系统如何做好防雷?——视频信号SPD综合应用方案解析
运维·服务器·防雷产品·信号保护·信号防雷·spd
楼田莉子10 小时前
Docker学习:Docker介绍及其架构介绍
运维·后端·学习·docker·容器·架构
大明者省11 小时前
IIS 端口绑定正常访问的原理说明与常见误区澄清
运维·服务器·笔记