在华为云服务器上使用Ansible部署LNMP环境【玩转华为云】
一、华为云弹性云服务器ECS介绍
华为云弹性云服务器 ECS:提供安全稳定、可随时自助获取、弹性伸缩的计算服务,灵活计费,极简运维,极大降低企业成本。
三、本次实践介绍
3.1 本次实践简介
本次实践为在华为云弹性云服务器上部署Ansible 部署 LNMP 环境。
3.2 本次实践环境介绍
1.本次实践环境为华为KooLabs云实验平台;
2.本次实践使用服务器为华为云弹性云服务器ECS。
四、环境准备工作
4.1 登录华为云
进入【实验操作桌面】,打开Chrome浏览器,首次可自动登录并进入华为云控制台页面。如后续关闭浏览器重新登录或自动登录失败,可按如此步骤登录:选择【IAM用户登录】模式,于登录对话框中输入系统为您分配的华为云实验账号和密码登录华为云。
4.2 创建虚拟机私有云VPC
点击服务列表->“网络”->“虚拟私有云VPC”,点击进入VPC管理页面。
按如下配置参数,创建VPC。
配置参数:[基本信息]
① 区域:华北-北京四,
② 名称:vpc-lnmp
③ 网域:192.168.0.0/16,
高级配置:默认,[默认子网
]① 可用区:任选一项,
② 名称:subnet-lnmp
③ 子网IPv4网段:192.168.1.0/24,
④ 子网IPv6网段:不勾选,
⑤ 其他:默认,
4.3 创建安全组
在网络控制台中点击:访问控制-安全组,进入安全组管理页面。
点击创建安全组,配置如下:
填入如下信息。
①名称:sg-lnmp (该名称用于条件检测,请默认使用)
②模板:通用Web服务器
配置安全组规则:
在弹出的页面输入图示信息,在入方向上,提前放开mysql与php的3306与9000端口,并确认。
4.5 购买弹性云服务器
回到控制台,点击服务列表-弹性云服务器。
- 点击购买弹性云服务器,规格如下:
① 区域:华北-北京四,
② 计费方式:按需计费,
③ 可用区:随机分配,
④ CPU 架构:x86 计算
⑤ 规格:通用计算增强型 | c6s.2xlarge.2 | 8vCPUs | 16 GiB
⑥ 镜像:公共镜像 centos 7.6
⑦ 系统盘:通用性 SSD 40GB
⑧ 购买量:选择 2 台
- 网络配置如下:
① 网络:vpc-lnmp
② 安全组:sg-lnmp(注意:请选择该名称的安全组
③ 弹性公网 IP:现在购买/全动态 BGP/按流量计费/带宽大小 100M
- 高级配置如下:
服务器名称:ecs-ansible-lnmp
② 登录凭证:密码
③ 密码:自定义
④ 云备份:暂不购买
- 检查弹性云服务器的配置信息,确认后,点击购买。
4.6 查看弹性云服务器状态
检查两台弹性云服务器状态
五、编写Ansible-playbook
5.1 登录弹性云服务器
打开云服务器控制台,复制后缀为 0001 的服务器 ecs-ansible-lnmp-0001 的弹性公网IP。
1.回到实验桌面,双击桌面中的“Xfce终端”打开Terminal终端,并输入以下命令登录该服务器;
2.请使用复制下来的的弹性云服务器的公网IP替换命令中的【EIP】。
ssh root@EIP
5.2 搭建 playbook 框架
创建ansible的相关角色目录
mkdir -p lnmp/roles/mysql_install/handlers
mkdir -p lnmp/roles/mysql_install/meta
mkdir -p lnmp/roles/mysql_install/tasks
mkdir -p lnmp/roles/mysql_install/templates
mkdir -p lnmp/roles/mysql_install/vars
mkdir -p lnmp/roles/nginx_install/handlers
mkdir -p lnmp/roles/nginx_install/meta
mkdir -p lnmp/roles/nginx_install/tasks
mkdir -p lnmp/roles/nginx_install/templates
mkdir -p lnmp/roles/nginx_install/vars
mkdir -p lnmp/roles/php_install/handlers
mkdir -p lnmp/roles/php_install/meta
mkdir -p lnmp/roles/php_install/tasks
mkdir -p lnmp/roles/php_install/templates
mkdir -p lnmp/roles/php_install/vars
5.3 安装ansible
安装ansible软件
yum -y install tree ansible
查看ansible的角色目录层级
cd lnmp && tree .
5.4 脚本文件介绍
主目录中包含上述 4 个脚本,其中
- lnmp.yml 安装 LNMP 环境的总脚本
- mysql.yml 仅安装 mysql 的分脚本
- php.yml 仅安装 php 的分脚本
- nginx.yml 仅安装 nginx 的分脚本因为总脚本是分脚本的集成,我们先写mysql,php和nginx的分脚本
5.5 编辑mysql 分脚本
- 编辑mysql 分脚本,内容如下:
vi /root/lnmp/mysql.yml
# 用于批量安装 Mysql
---
- hosts: all
remote_user: root
gather_facts: True
roles:
- mysql_install
- 变量声明 main.yml(mysql)
vi /root/lnmp/roles/mysql_install/vars/main.yml
# 定义安装的 mysql 的参数
MYSQL_VER: 5.7.33
MYSQL_VER_MAIN: "{{ MYSQL_VER.split('.')[0] }}.{{ MYSQL_VER.split('.')[1] }}"
DOWNLOAD_URL: https://sandbox-expriment-files.obs.cn-north-1.myhuaweicloud.com/2449/mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz
MYSQL_USER: mysql
MYSQL_PORT: 3306
MYSQL_PASSWD: Huawei@123
SOURCE_DIR: /software
BASE_DIR: /usr/local/mysql
DATA_DIR: /data/mysql
- 下载声明 download.yml(mysql)
vi /root/lnmp/roles/mysql_install/tasks/download.yml
- name: 创建mysql用户组
group: name={{ MYSQL_USER }} state=present
- name: 创建mysql用户
user: name={{ MYSQL_USER }} group={{ MYSQL_USER }} state=present create_home=False shell=/sbin/nologin
- name: 创建所需目录
file: name={{ item }} state=directory mode=0755 recurse=yes # 这里的0755指的是:文件所有者对文件具有读、写和执行权限;组用户和其他用户对文件需有读和执行权限
with_items:
- "{{ SOURCE_DIR }}"
- "{{ DATA_DIR }}"
- name: 更改目录属主属组
file: name={{ DATA_DIR }} owner={{ MYSQL_USER }} group={{ MYSQL_USER }}
#当前主机下没有mysql包
- name: 下载mysql包
get_url: url={{ DOWNLOAD_URL }} dest={{ SOURCE_DIR }} owner={{ MYSQL_USER }} group={{ MYSQL_USER }}
#当前主机file目录下已有mysql包
#- name: 拷贝现有mysql包到所有主机
# copy: src=mysql-{{ MYSQL_VER }}-linux-glibc2.12-x86_64.tar.gz dest={{ SOURCE_DIR }} owner={{ MYSQL_USER }} group={{ MYSQL_USER }} # src 目录是主机的file目录
- name: 解压mysql包
unarchive: src={{ SOURCE_DIR }}/mysql-{{ MYSQL_VER }}-linux-glibc2.12-x86_64.tar.gz dest=/usr/local copy=no owner={{ MYSQL_USER }} group={{ MYSQL_USER }} # copy=no,该参数可在远程机上解压
- name: 目录重命名
shell: "mv /usr/local/mysql-{{ MYSQL_VER }}-linux-glibc2.12-x86_64/ {{ BASE_DIR }} && chown -R {{ MYSQL_USER }}:{{ MYSQL_USER }} {{ BASE_DIR }}" # 留意 mv 指令还有移动文件位置的功能
#复制mysql配置文件
- name: 拷贝mysql配置文件
template: src=my.cnf dest=/etc/my.cnf owner=root group=root
#复制mysql服务文件
- name: 拷贝mysql服务文件
template: src=mysqld.service dest=/usr/lib/systemd/system/mysqld.service owner=root group=root
#复制更改密码脚本
- name: 拷贝更改密码脚本
template: src=change_passwd.sh dest={{ SOURCE_DIR }} owner=root group=root
- name: 创建日志目录
file: name={{ item }} state=directory owner={{ MYSQL_USER }} group={{ MYSQL_USER }} mode=0755 recurse=yes
with_items:
- "/var/log/mysql/"
- "/var/run/mysqld/"
- "{{ BASE_DIR }}/tmp"
- "{{ BASE_DIR }}/log"
- "/etc/init.d/mysql/"
- name: 创建错误日志文件
file: name={{ item }} state=touch owner={{ MYSQL_USER }} group={{ MYSQL_USER }} mode=0644 # 文件格式新建是 touch
with_items:
- "{{ BASE_DIR }}/log/error.log"
- 初始化安装 install.yml(mysql)
vi /root/lnmp/roles/mysql_install/tasks/install.yml
# 初始化安装 mysql
- name: mysql初始化
shell: "{{ BASE_DIR }}/bin/mysqld --initialize-insecure --user={{ MYSQL_USER }} --basedir={{ BASE_DIR }} --datadir={{ DATA_DIR }}"
- name: 拷贝启动脚本到/etc下
# copy: src={{ BASE_DIR }}/support-files/mysql.server dest=/etc/init.d/mysql # copy 命令只能从管理主机上复制对象,自节点上不可复制,所以使用 cp 命令
shell: "cp {{ BASE_DIR }}/support-files/mysql.server /etc/init.d/mysql"
- name: 修改启动脚本_1
lineinfile:
dest: /etc/init.d/mysql/mysql.server
regexp: "^basedir="
insertbefore: "^# Default value, in seconds, afterwhich the script should timeout waiting"
line: "basedir={{ BASE_DIR }}"
- name: 修改启动脚本_2
lineinfile:
dest: /etc/init.d/mysql/mysql.server
regexp: "^datadir="
insertbefore: "^# Default value, in seconds, afterwhich the script should timeout waiting"
line: "datadir={{ DATA_DIR }}"
- name: 修改启动脚本_3
file: dest=/etc/init.d/mysql/mysql.server state=file mode=0755
- name: 配置环境变量
shell: " if [ `grep {{ BASE_DIR }}/bin /etc/profile |wc -l` -eq 0 ]; then echo export PATH=$PATH:{{ BASE_DIR }}/bin >> /etc/profile && source /etc/profile; else source /etc/profile; fi"
- name: 启动mysql并开机启动
shell: "systemctl daemon-reload && systemctl enable mysqld && systemctl start mysqld"
- name: 设置数据库root密码 # 这一步的目的在于登录 mysql 需要重新设置 root 密码
shell: "bash {{ SOURCE_DIR }}/change_passwd.sh"
- 引用文件 main.yml(mysql)
vi /root/lnmp/roles/mysql_install/tasks/main.yml
# 引用 prepare、copy、install 模块
- include: prepare.yml
- include: download.yml
- include: install.yml
- 配置文件my.cnf(mysql)
vi /root/lnmp/roles/mysql_install/templates/my.cnf
[client]
port = {{ MYSQL_PORT }} # 主机 3306 端口
socket = {{ BASE_DIR }}/tmp/mysql.sock
[mysql] # 默认编码格式
default-character-set=utf8
[mysqld] # mysql 数据库的默认属性
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
- 编辑 mysqld.service(mysql)
vi /root/lnmp/roles/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 密码脚本 change_passwd.sh
vi /root/lnmp/roles/mysql_install/templates/change_passwd.sh
# 该脚本用于更改数据库 root 密码
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';"
5.6 编写 php 分脚本
- 编辑入口文件 php.yml文件
vi /root/lnmp/php.yml
# 用于批量安装 PHP
---
- hosts: all
remote_user: Huawei
gather_facts: True
roles:
- php_install
- 变量声明 main.yml
vi /root/lnmp/roles/php_install/vars/main.yml
# 所安装的 PHP 版本信息
PHP_VER: 7.4.26
DOWNLOAD_URL: https://sandbox-expriment-files.obs.cn-north-1.myhuaweicloud.com/2449/php-7.4.26.tar.gz
PHP_USER: php-fpm
PHP_PORT: 9000
SOURCE_DIR: /software
PHP_DIR: /usr/local/php7
MYSQL_DIR: /usr/local/mysql
- php 下载 download.yml
vi /root/lnmp/roles/php_install/tasks/download.yml
- name: 创建php用户组
group: name={{ PHP_USER }} state=present
- name: 创建php用户
user: name={{ PHP_USER }} group={{ PHP_USER }} state=present create_home=False shell=/sbin/nologin
#- name: 创建software目录
# file: name={{ SOURCE_DIR }} state=directory mode=0755 recurse=yes
#当前主机下没有libmcrypt依赖包
- name: 下载依赖包libmcrypt
get_url: url=https://sandbox-expriment-files.obs.cn-north-1.myhuaweicloud.com/2449/libmcrypt-2.5.8.tar.gz dest={{ SOURCE_DIR }}
#当前主机file目录下已有libmcrypt依赖包
#- name: 拷贝现有libmcrypt依赖包到所有主机
# copy: src=libmcrypt-2.5.8.tar.gz dest={{ SOURCE_DIR }}
#当前主机下没有php包
- name: 下载php包
get_url: url={{ DOWNLOAD_URL }} dest={{ SOURCE_DIR }} owner={{ PHP_USER }} group={{ PHP_USER }}
# 当前主机file目录下已有php包
#- name: 拷贝现有php包到所有主机
# copy: src=php-{{ PHP_VER }}.tar.gz dest={{ SOURCE_DIR }} owner={{ PHP_USER }} group={{ PHP_USER }}
- name: 解压依赖包libmcrypt
unarchive: src={{ SOURCE_DIR }}/libmcrypt-2.5.8.tar.gz dest={{ SOURCE_DIR }} copy=no
- name: 安装libmcrypt
shell: "cd {{ SOURCE_DIR }}/libmcrypt-2.5.8 && yum -y install gcc-c++ && ./configure && make && make install"
# shell: "yum -y install libmcrypt-2.5.8"
- name: 解压php包
unarchive: src={{ SOURCE_DIR }}/php-{{ PHP_VER }}.tar.gz dest={{ SOURCE_DIR }} copy=no owner={{ PHP_USER }} group={{ PHP_USER }}
- php 安装 install.yml
vi /root/lnmp/roles/php_install/tasks/install.yml
# 编译PHP
- name: 编译php # 一大串编译选项和具体的部署环境有关,在HW云主机上测试,很多预置项是找不到的
shell: "cd {{ SOURCE_DIR }}/php-{{ PHP_VER }} && yum -y install sqlite-devel && yum -y install oniguruma-devel && yum -y install libxml2-devel && ./configure --prefix={{ PHP_DIR }} --with-config-file-path={{ PHP_DIR }}/etc --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mysql={{ MYSQL_DIR }} --with-mysql-sock={{ MYSQL_DIR }}/tmp/mysql.sock --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-bz2 --with-libxml-dir --with-curl --with-gd --with-openssl --with-mhash --with-xmlrpc --with-pdo-mysql --with-libmbfl --with-onig --with-pear --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --enable-mbregex --enable-fpm --enable-mbstring --enable-pcntl --enable-sockets --enable-zip --enable-soap --enable-opcache --enable-pdo --enable-mysqlnd-compression-support --enable-maintainer-zts --enable-session --with-fpm-user={{ PHP_USER }} --with-fpm-group={{ PHP_USER }}"
# 安装PHP
- name: 安装php # j 后的数字代表进程数,一般来说和主机的核数有关系 8核云主机,修改为8
shell: "cd {{ SOURCE_DIR }}/php-{{ PHP_VER }} && make -j 8 && make -j 8 install"
- name: 创建php-fpm配置目录
file: name={{ PHP_DIR }}/etc state=directory owner={{ PHP_USER }} group={{ PHP_USER }} mode=0755 recurse=yes
- name: 修改php-fpm配置_1
shell: "cd {{ SOURCE_DIR }}/php-{{ PHP_VER }} && cp php.ini-production {{ PHP_DIR }}/etc/php.ini"
- name: 修改php-fpm配置_2 # 设置单次推送内容最大体积
lineinfile:
dest: "{{ PHP_DIR }}/etc/php.ini"
regexp: "post_max_size = 8M"
line: "post_max_size = 16M"
- name: 修改php-fpm配置_3 # 配置缺省的最长执行时间
lineinfile:
dest: "{{ PHP_DIR }}/etc/php.ini"
regexp: "max_execution_time = 30"
line: "max_execution_time = 300"
- name: 修改php-fpm配置_4 # 设置了在强制终止脚本前PHP等待脚本执行完毕的时间,此时间以秒计算。当脚本进入了一个无限循环状态 时此变量非常有用
lineinfile:
dest: "{{ PHP_DIR }}/etc/php.ini"
regexp: "max_input_time = 60"
line: "max_input_time = 300"
- name: 修改php-fpm配置_5 # 配置时区
lineinfile:
dest: "{{ PHP_DIR }}/etc/php.ini"
regexp: ";date.timezone ="
line: "date.timezone = Asia/Shanghai"
# 复制启动配置文件
- name: 拷贝启动配置文件
shell: "cd {{ SOURCE_DIR }}/php-{{ PHP_VER }} && cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm && chmod +x /etc/init.d/php-fpm"
# 复制 PHP 主配置文件
- name: 拷贝php主配置文件
template: src=php-fpm.conf dest={{ PHP_DIR }}/etc/php-fpm.conf owner={{ PHP_USER }} group={{ PHP_USER }}
# 编译安装 ldap 模块
- name: 编译安装ldap模块
shell: "cd {{ SOURCE_DIR }}/php-{{ PHP_VER }}/ext/ldap && cp -af /usr/lib64/libldap* /usr/lib/ && {{ PHP_DIR }}/bin/phpize && ./configure --with-php-config={{ PHP_DIR }}/bin/php-config && make && make install"
- name: 修改php-fpm配置_6
lineinfile:
dest: "{{ PHP_DIR }}/etc/php.ini"
regexp: ";extension=bz2"
line: "aextension=ldap.so"
# 编译安装 getext 模块
- name: 编译安装gettext模块
shell: "cd {{ SOURCE_DIR }}/php-{{ PHP_VER }}/ext/gettext && cp -af /usr/lib64/libldap* /usr/lib/ && {{ PHP_DIR }}/bin/phpize && ./configure --with-php-config={{ PHP_DIR }}/bin/php-config && make && make install"
- name: 修改php-fpm配置_7
lineinfile:
dest: "{{ PHP_DIR }}/etc/php.ini"
regexp: ";extension=bz2"
line: "aextension=gettext.so"
- name: 修改php-fpm配置_8
lineinfile:
dest: "{{ PHP_DIR }}/etc/php.ini"
regexp: "pdo_mysql.default_socket="
line: "pdo_mysql.default_socket=/usr/local/mysql/tmp/mysql.sock"
- name: 修改php-fpm配置_9
lineinfile:
dest: "{{ PHP_DIR }}/etc/php.ini"
regexp: "mysqli.default_socket ="
line: "mysqli.default_socket =/usr/local/mysql/tmp/mysql.sock"
- name: 启动php并开机启动
shell: "chkconfig --add php-fpm && chkconfig php-fpm on && /etc/init.d/php-fpm start"
- 引用文件 main.yml(php)
vi /root/lnmp/roles/php_install/tasks/main.yml
# 引用 prepare、copy、install 模块
# - include: prepare.yml
- include: download.yml
- include: install.yml
- php 主配置文件 php-fpm.conf
vi /root/lnmp/roles/php_install/templates/php-fpm.conf
[global]
pid = {{ PHP_DIR }}/var/run/php-fpm.pid
error_log = {{ PHP_DIR }}/var/log/php-fpm.log
[www]
listen = 127.0.0.1:{{ PHP_PORT }}
listen.mode = 666
listen.owner = nobody
listen.group = nobody
user = {{ PHP_USER }}
group = {{ PHP_USER }}
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
5.7 编写nginx 分脚本
- 入口文件 nginx.yml
vi /root/lnmp/nginx.yml
# 用于批量安装 Nginx
---
- hosts: all
remote_user: Huawei
gather_facts: True
roles:
- nginx_install
- 变量声明 main.yml(nginx)
vi /root/lnmp/roles/nginx_install/vars/main.yml
# 定义nginx安装的参数信息
NGINX_VER: 1.15.0
DOWNLOAD_URL: https://sandbox-expriment-files.obs.cn-north-1.myhuaweicloud.com/2449/nginx-1.15.0.tar.gz
NGINX_USER: Huawei
NGINX_PORT: 80
SOURCE_DIR: /software
NGINX_DIR: /usr/local/nginx
DATA_DIR: /data/nginx
- nginx 下载 download.yml
vi /root/lnmp/roles/nginx_install/tasks/download.yml
- name: 创建nginx用户组
group: name={{ NGINX_USER }} state=present
- name: 创建nginx用户
user: name={{ NGINX_USER }} group={{ NGINX_USER }} state=present create_home=False shell=/sbin/nologin
# - name: 创建software目录
# file: name={{ SOURCE_DIR }} state=directory mode=0755 recurse=yes
- name: 创建日志目录
file: name={{ item }} state=directory owner={{ NGINX_USER }} group={{ NGINX_USER }} mode=0755 recurse=yes
with_items:
- "{{ DATA_DIR }}"
- "{{ DATA_DIR }}/log"
- name: 创建日志文件
file: name={{ item }} state=touch owner={{ NGINX_USER }} group={{ NGINX_USER }} mode=0644
with_items:
- "{{ DATA_DIR }}/log/access.log"
- "{{ DATA_DIR }}/log/error.log"
# 当前主机下没有 nginx 安装包
- name: 下载nginx包
get_url: url={{ DOWNLOAD_URL }} dest={{ SOURCE_DIR }} owner={{ NGINX_USER }} group={{ NGINX_USER }}
# 当前主机 file 目录下已有nginx安装包
#- name: 拷贝现有nginx包到所有主机
# copy: src=nginx-{{ NGINX_VER }}.tar.gz dest={{ SOURCE_DIR }} owner={{ NGINX_USER }} group={{ NGINX_USER }}
- name: 解压nginx包
unarchive: src={{ SOURCE_DIR }}/nginx-{{ NGINX_VER }}.tar.gz dest={{ SOURCE_DIR }} copy=no owner={{ NGINX_USER }} group={{ NGINX_USER }}
# 复制 nginx 服务文件
- name: 拷贝nginx服务文件
template: src=nginx.service dest=/usr/lib/systemd/system/nginx.service owner=root group=root
- nginx 安装 install.yml
vi /root/lnmp/roles/nginx_install/tasks/install.yml
# 编译 nginx
- name: 编译nginx
shell: "cd {{ SOURCE_DIR }}/nginx-{{ NGINX_VER }} && ./configure --prefix={{ NGINX_DIR }} --user={{ NGINX_USER }} --group={{ NGINX_USER }} --http-log-path={{ DATA_DIR }}/log/access.log --error-log-path={{ DATA_DIR }}/log/error.log --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_stub_status_module"
# 安装 nginx
- name: 安装nginx
shell: "cd {{ SOURCE_DIR }}/nginx-{{ NGINX_VER }} && make && make install"
# 复制 nginx 主配置文件
- name: 拷贝nginx主配置文件
template: src=nginx.conf dest={{ NGINX_DIR }}/conf/nginx.conf owner={{ NGINX_USER }} group={{ NGINX_USER }}
- name: 创建vhost配置文件目录
file: name={{ NGINX_DIR }}/conf/vhost state=directory owner={{ NGINX_USER }} group={{ NGINX_USER }} mode=0755 recurse=yes
# 复制 nginx vhost 配置文件
- name: 拷贝nginx vhost配置文件
template: src=server.conf dest={{ NGINX_DIR }}/conf/vhost/server.conf owner={{ NGINX_USER }} group={{ NGINX_USER }} mode=0644
# 复制 nginx 额外配置文件
- name: 拷贝nginx额外配置文件
template: src=fastcgi_params dest={{ NGINX_DIR }}/conf/fastcgi_params owner={{ NGINX_USER }} group={{ NGINX_USER }} mode=0644
- name: 配置环境变量
shell: " if [ `grep {{ NGINX_DIR }}/sbin /etc/profile |wc -l` -eq 0 ]; then echo export PATH=$PATH:{{ NGINX_DIR }}/sbin >> /etc/profile && source /etc/profile; else source /etc/profile; fi"
- name: 启动nginx并开机启动
shell: "systemctl daemon-reload && systemctl enable nginx && systemctl start nginx"
- name: 添加php测试页index.php
shell: " echo '<?php phpinfo(); ?>' >> {{ NGINX_DIR }}/html/index.php"
- 引用文件 main.yml(nginx)
vi /root/lnmp/roles/nginx_install/tasks/main.yml
#引用prepare、copy、install模块
#- include: prepare.yml # 理解为什么这里注释掉?
- include: download.yml
- include: install.yml
- nginx 主配置文件 nginx.conf
vi /root/lnmp/roles/nginx_install/templates/nginx.conf
user nobody nobody;
worker_processes 1;
error_log {{ DATA_DIR }}/log/error.log crit;
pid /run/nginx.pid;
worker_rlimit_nofile 51200;
events {
worker_connections 1024;
}
http {
include mime.types;
log_format main '$remote_addr - $remote_user [$time_local] "\$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log {{ DATA_DIR }}/log/access.log main;
server_tokens off;
sendfile on;
send_timeout 3m;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_header_timeout 3m;
client_body_timeout 3m;
connection_pool_size 256;
client_header_buffer_size 1k;
large_client_header_buffers 8 4k;
request_pool_size 4k;
output_buffers 4 32k;
postpone_output 1460;
client_max_body_size 10m;
client_body_buffer_size 256k;
client_body_temp_path {{ NGINX_DIR }}/client_body_temp;
proxy_temp_path {{ NGINX_DIR }}/proxy_temp;
fastcgi_temp_path {{ NGINX_DIR }}/fastcgi_temp;
fastcgi_intercept_errors on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_comp_level 5;
gzip_http_version 1.1;
gzip_types text/plain application/x-javascript text/css text/htm
application/xml;
default_type application/octet-stream;
include {{ NGINX_DIR }}/conf/vhost/*.conf;
}
- nginx host 配置文件 server.conf
vi /root/lnmp/roles/nginx_install/templates/server.conf
server {
listen 80;
server_name localhost;
location / {
root {{ NGINX_DIR }}/html;
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ \.php$ {
root {{ NGINX_DIR }}/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
- nginx 额外配置文件 fastcgi_params
vi /root/lnmp/roles/nginx_install/templates/fastcgi_params
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
- nginx 服务文件 nginx.service
vi /root/lnmp/roles/nginx_install/templates/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre={{ NGINX_DIR }}/sbin/nginx -t
ExecStart={{ NGINX_DIR }}/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
5.8 编写 lnmp 总脚本
- 创建 lnmp 入口文件,集中调用 roles(分脚本)
vi /root/lnmp/lnmp.yml
---
- hosts: all
remote_user: root
gather_facts: True
roles:
- mysql_install
- hosts: all
remote_user: root
gather_facts: True
roles:
- php_install
- nginx_install
- 创建prepare.yml配置文件
vi /root/lnmp/prepare.yml
#- name: 关闭firewalld # 云主机的防火墙一般默认都是关闭的
# service: name=firewalld state=stopped enabled=no
#- name: 临时关闭 selinux # 云主机一般默认关闭
# shell: "setenforce 0"
# failed_when: false
#- name: 永久关闭 selinux
# lineinfile:
# dest: /etc/selinux/config
# regexp: "^SELINUX="
# line: "SELINUX=disabled"
- name: 添加EPEL仓库 # 为“红帽系”的操作系统提供额外的软件包
yum: name=epel-release state=latest
- name: 安装常用软件包
yum:
name:
- vim
- lrzsz
- net-tools
- wget
- curl
- bash-completion
- rsync
- gcc
- unzip
- git
- perl-Data-Dumper
- libaio-devel
- autoconf
- cmake
- openssl
- openssl-devel
- pcre
- pcre-devel
- zlib
- zlib-devel
- gd-devel
- libxml2-devel
- bzip2-devel
- gnutls-devel
- ncurses-devel
- bison
- bison-devel
- openldap
- openldap-devel
- libcurl-devel
- libevent
- libevent-devel
- expat-devel
- numactl
- tree
state: latest
- name: 更新系统
shell: "yum update -y"
args:
warn: False
- 查看编辑好的树目录情况
tree /root/lnmp
六、部署测试
6.1 准备部署环境
在正式部署前,需搭建控制服务器与节点服务器间的连接。在控制服务器中(安装了 Ansible 组件,即后缀为0001的服务器)
ssh-keygen -t rsa
将本地生成的公钥,发送至节点服务器,输入命令,此处的IP需替换成节点服务器(即后缀为0002的服务器:ecs-ansible-lnmp-0002)的 IP
ssh-copy-id -i ~/.ssh/id_rsa.pub root@IP
- 修改控制服务器 ansible/hosts 配置文件,目的是将上步骤的节点服务器 IP 放入配置文件中,解析该节点地址。
vi /etc/ansible/hosts
6.2 一键部署
成功编写 ansible 脚本后,现在可以开始测试。
ansible-playbook lnmp.yml
6.3 检查节点服务器上 LNMP
登录节点服务器上(后缀为0002的服务器),查看相关服务端口占用情况。
netstat -lntp
- 点赞
- 收藏
- 关注作者
评论(0)