运维之道 | Ansible 自动化项目实战 LNMP 服务安装部署

一、LNMP部署规划

Mysql部署详情信息:
mysql_basedir: /usr/local/mysql/                            源码目录
mysql_datadir: /data/mysql/                                 数据目录
mysql_user: mysql                                           mysql用户
mysql_database_user: root                                   数据库用户
mysql_passwd: '123456789'                                   数据库密码
mysql_port: 3306                                            mysql监听端口
mysql_sock: /usr/local/mysql/tmp/mysql.sock                 mysql的sock
mysql_charset: utf8                                         mysql字符集
mysql_collation: utf8_general_ci                            mysql排序方式
mysql_version: mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz   mysql版本
mysql_log_dir: /usr/local/mysql/log/                        mysql日志目录
PHP部署详情信息:
php_user: php-fpm                        php-fpm模式的启动用户
php_port: 9000                           php-fpm使用tcp的端口
php_dir: /usr/local/php7                 php的安装目录
php_version: 7.2.6                       php的版本
mysql_basedir: /usr/local/mysql/         mysql的目录
php_log_dir: /usr/local/php7/var/log/    php日志目录
Nginx部署详情信息:
nginx_user: php-fpm                     nginx用户
nginx_port: 80                          nginx监听端口
nginx_web_dir: /usr/local/nginx         nginx的目录
nginx_version: 1.15.0                   nginx的版本
pcre_version: 8.32                      pcre的版本
nginx_log_dir: /data/nginx/log/         nginx日志目录
LNMP部署所需软件:Mysql、PHP、Nginx、Libmcrypt

二、部署准备

1、将所需部署 LNMP 的主机规划为 webserver 组
[root@localhost ~]# vim /etc/ansible/hosts 
[webserver]
192.168.182.11:22
2、创建批量部署管理目录
[root@localhost roles]# mkdir -p {
   mysql_install,nginx_install,php_install}/{
   files,handlers,meta,tasks,templates,vars}

目录说明:

  • files:存放需要同步到异地服务器的源码文件及配置文件;
  • handlers:当资源发生变化时需要进行的操作,若没有此目录可以不建或为空;
  • meta:存放说明信息、说明角色依赖等信息,可留空;
  • tasks:安装过程中需要进行执行的任务;
  • templates:用于执行lnmp安装的模板文件,一般为脚本;
  • vars:本次安装定义的变量

最终目录文件创建效果:

[root@localhost roles]# tree .
.
├── lnmp.yml
└── roles
    ├── mysql_install
    │   ├── files
    │   │   └── mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
    │   ├── tasks
    │   │   ├── copy.yml
    │   │   ├── install.yml
    │   │   ├── main.yaml
    │   │   └── prepare.yml
    │   ├── templates
    │   │   ├── change_passwd.sh
    │   │   ├── my.cnf
    │   │   └── mysqld.service
    │   └── vars
    │       └── main.yml
    ├── nginx_install
    │   ├── files
    │   │   └── nginx-1.15.0.tar.gz
    │   ├── tasks
    │   │   ├── copy.yml
    │   │   ├── install.yml
    │   │   └── main.yml
    │   ├── templates
    │   │   ├── fastcgi_params
    │   │   ├── nginx.conf
    │   │   ├── nginx.service
    │   │   └── server.conf
    │   └── vars
    │       └── main.yml
    └── php_install
        ├── files
        │   ├── libmcrypt-2.5.8.tar.gz
        │   └── php-7.2.6.tar.gz
        ├── handlers
        ├── meta
        ├── tasks
        │   ├── copy.yml
        │   ├── install.yml
        │   └── main.yml
        ├── templates
        │   └── php-fpm.conf
        └── vars
            └── main.yml

18 directories, 26 files
3、创建LNMP入口文件,用来调用roles
[root@localhost roles]# vim lnmp.yml

---
- hosts: webserver
  remote_user: root
  gather_facts: True

  roles:
    - php_install
    - nginx_install

三、部署 Mysql 数据库

1、创建mysql入口文件,用来调用mysql_install
[root@localhost roles]# vim mysql.yml
#用于批量安装MySQL

---
- hosts: dbserver
  remote_user: root
  gather_facts: True

  roles:
    - mysql_install
2、创建变量
[root@localhost roles]# vim mysql_install/vars/main.yml
#定义mysql安装中的变量

MYSQL_VER: 5.7.25
MYSQL_VER_MAIN: "{
   { MYSQL_VER.split('.')[0] }}.{
   { MYSQL_VER.split('.')[1] }}"

DOWNLOAD_URL: https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-{
   {
    MYSQL_VER_MAIN }}/mysql-{
   {
    MYSQL_VER }}-linux-glibc2.12-x86_64.tar.gz
MYSQL_USER: mysql
MYSQL_PORT: 3306
MYSQL_PASSWD: 123456789
SOURCE_DIR: /software
BASE_DIR: /usr/local/mysql
DATA_DIR: /data/mysql
3、创建模板文件
  • mysql配置文件(部署之前需将mysql原配置文件删除)
[root@localhost roles]# vim mysql_install/templates/my.cnf

[client]
port    = {
   {
    MYSQL_PORT }}
socket = {
   {
    BASE_DIR }}/tmp/mysql.sock

[mysql]
default-character-set=utf8

[mysqld]
default-storage-engine=INNODB
character_set_server=utf8
explicit_defaults_for_timestamp
basedir={
   {
    BASE_DIR }}
datadir={
   {
    DATA_DIR }}
socket={
   {
    BASE_DIR }}/tmp/mysql.sock
log_error = {
   {
    BASE_DIR }}/log/error.log

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  • mysql服务文件(部署之前需将mysql原配置文件删除)
[root@localhost roles]# vim mysql_install/templates/mysqld.service

[Unit]
Description=MySQL Server
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
ExecStart={
   {
    BASE_DIR }}/bin/mysqld --defaults-file=/etc/my.cnf

#连接数限制
LimitNOFILE=65535
LimitNPROC=65535

#Restart配置可以在进程被kill掉之后,让systemctl产生新的进程,避免服务挂掉
#Restart=always
PrivateTmp=false
  • 更改数据库root密码脚本
[root@localhost roles]# vim mysql_install/templates/change_passwd.sh
#该脚本用于更改数据库root密码

#!/bin/bash

passwd={
   {
    MYSQL_PASSWD }}
n=`grep "{
    { BASE_DIR }}/bin" /etc/profile |wc -l`

if [ $n -eq 0 ]
then
        echo "export PATH=$PATH:{
   { BASE_DIR }}/bin" >> /etc/profile
        source /etc/profile
else
        source /etc/profile
fi

{
   {
    BASE_DIR }}/bin/mysql -uroot -D mysql -e "UPDATE user SET authentication_string=PASSWORD("$passwd") WHERE user='root';"

{
   {
    BASE_DIR }}/bin/mysql -uroot -e "FLUSH PRIVILEGES;"

{
   {
    BASE_DIR }}/bin/mysql -uroot -p$passwd -e "grant all privileges on *.* to root@'%'  identified by '$passwd';

你可能感兴趣的:(Ansible)