当前位置: 首页 > news >正文

【运维知识进阶篇】Ansible实现一套完整LNMP架构

前面介绍了PlayBook怎么写服务部署,把服务部署上后,我们来用Ansible来部署项目,实现一套完整的LNMP架构。我们部署wordpress、wecenter、phpshe、phpmyadmin这四个项目。将其所有的剧本都写入lnmp.yml中,相关备份数据都放入root/ansible/lnmp中,最终实现一个剧本一条命令部署4个项目的效果,话不多说,直接开始!

1、准备工作

主机名称主机IP(外网、内网)作用
LB0110.0.0.5、172.16.1.5七层负载均衡、keepalived高可用
LB0210.0.0.6、172.16.1.6七层负载均衡、keepalived高可用
Web0110.0.0.7、172.16.1.7Nginx、php服务、存放代码文件
Web0210.0.0.8、172.16.1.8Nginx、php服务、存放代码文件
NFS10.0.0.31、172.16.1.31存放静态资源
MySQL10.0.0.51、172.16.1.51存放动态数据
Ansible10.0.0.61、172.16.1.61使用Ansible作为控制机

2、写剧本

1、将目标主机添加至主机列表

[root@Ansible ~]# cat /etc/ansible/hosts
[lb_group]
lb01 ansible_ssh_host=10.0.0.5
lb02 ansible_ssh_host=10.0.0.6[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8[nfs_group]
nfs ansible_ssh_host=10.0.0.31[mysql_group]
mysql ansible_ssh_host=10.0.0.51[nginx_install_group:children]
lb_group
web_group

2、创建剧本存放目录并收集部署项目所需要的资源

我的思路是针对服务器的功能去进行项目资源的收集

[root@Ansible ~]# mkdir ansible/lnmp#1、在lb01上部署七层负载,我们需要nginx.conf(方便区分可以命名为nginx_lb01.conf)、nginx_7.conf(七层负载配置)、证书、keepalived.conf、proxy_params[root@LB01 conf.d]# scp /etc/nginx/nginx.conf /etc/nginx/conf.d/proxy_7.conf /etc/nginx/proxy_params /etc/nginx/ssl_key/ /etc/keepalived/keepalived.conf 10.0.0.61:/root/ansible/lnmp[root@Ansible lnmp]# mv keepalived.conf keepalived_lb01.conf 
[root@Ansible lnmp]# mv nginx.conf nginx_lb01.conf#2、lb02与lb01所需文件大致相同,我们将keepalived.conf拷贝至管理机即可
[root@LB01 ~]# scp /etc/keepalived/keepalived.conf 10.0.0.51:/root/ansible/lnmp/keepalived_lb02.conf#3、web01与web02所需的文件一模一样,所以我们直接收集一个的即可
收集nginx.conf,conf.d/下的配置文件,php71.tar.gz压缩包,php.ini配置文件,/etc/php-fpm.d/www.conf,代码文件#4、NFS需要收集/etc/exports配置文件#5、MySQL需要收集数据库信息、redis.conf

3、写剧本

同样按照服务器功能去进行项目部署,有相同需求的操作,可以将其主机放在一个组中一起操作

[root@Ansible lnmp]# cat lnmp.yml 
- hosts: all                    tasks: - name: create group wwwgroup: name: wwwgid: 666- name: create user wwwuser:name: wwwuid: 666group: wwwshell: /sbin/nologincreate_home: false
- hosts: nginx_install_grouptasks:- name: nginx.repocopy:src: nginx.repodest: /etc/yum.repos.d/nginx.repo- name: install nginxyum:name: nginxstate: present- name: delete default.conffile:name: /etc/nginx/conf.d/default.confstate: absent- name: start and enable nginxsystemd:name: nginxstate: startedenabled: yes- hosts: keepalived_install_grouptasks: - name: copy nginx_lb01.confcopy:src: nginx_lb01.confdest: /etc/nginx/nginx.conf- name: copy proxy_7.confcopy:src: proxy_7.confdest: /etc/nginx/conf.d/proxy_7.conf- name: copy ssl_key to lb01 lb02copy:src: ssl_keydest: /etc/nginx/- name: copy proxy_params to lb01 lb02copy:src: proxy_paramsdest: /etc/nginx/proxy_params- name: restart nginxsystemd:name: nginxstate: restarted- name: install keepalivedyum:name: keepalived   state: present- name: start and enable keepalivedsystemd:name: keepalivedstate: startedenabled: yes- hosts: lb01tasks: - name: copy keepalived_lb01.confcopy:src: keepalived_lb01.confdest: /etc/keepalived/keepalived.conf- hosts: lb02tasks:- name: copy keepalived_lb02.confcopy: src: keepalived_lb02.confdest: /etc/keepalived/keepalived.conf          - hosts: keepalived_install_grouptasks:- name: restart keepalivedsystemd:name: keepalivedstate: restarted- hosts: web_grouptasks:- name: copy nginx_web.conf to web_groupcopy: src: nginx_web.confdest: /etc/nginx/nginx.conf- name: copy conf_web.d to web_groupcopy:src: conf_web.d/dest: /etc/nginx/conf.d- name: restart nginxsystemd:name: nginxstate: restarted- name: tar xf php to web_groupunarchive:src: php71.tar.gzdest: /root- name: localinstall rpmyum:name: - /root/autoconf-2.69-11.el7.noarch.rpm- /root/automake-1.13.4-3.el7.noarch.rpm- /root/libevent-2.0.21-4.el7.x86_64.rpm- /root/libjpeg-turbo-1.2.90-8.el7.x86_64.rpm- /root/libmcrypt-2.5.8-13.el7.x86_64.rpm- /root/libmemcached-1.0.16-5.el7.x86_64.rpm- /root/libtool-ltdl-2.4.2-22.el7_3.x86_64.rpm- /root/libX11-1.6.7-3.el7_9.x86_64.rpm- /root/libX11-common-1.6.7-3.el7_9.noarch.rpm- /root/libXau-1.0.8-2.1.el7.x86_64.rpm- /root/libxcb-1.13-1.el7.x86_64.rpm- /root/libXpm-3.5.12-1.el7.x86_64.rpm- /root/libxslt-1.1.28-6.el7.x86_64.rpm- /root/mod_php71w-7.1.33-1.w7.x86_64.rpm- /root/pcre-devel-8.32-17.el7.x86_64.rpm- /root/perl-Data-Dumper-2.145-3.el7.x86_64.rpm- /root/perl-Test-Harness-3.28-3.el7.noarch.rpm- /root/perl-Thread-Queue-3.02-2.el7.noarch.rpm- /root/php71w-cli-7.1.33-1.w7.x86_64.rpm- /root/php71w-common-7.1.33-1.w7.x86_64.rpm- /root/php71w-devel-7.1.33-1.w7.x86_64.rpm- /root/php71w-embedded-7.1.33-1.w7.x86_64.rpm- /root/php71w-fpm-7.1.33-1.w7.x86_64.rpm- /root/php71w-gd-7.1.33-1.w7.x86_64.rpm- /root/php71w-mbstring-7.1.33-1.w7.x86_64.rpm- /root/php71w-mcrypt-7.1.33-1.w7.x86_64.rpm- /root/php71w-mysqlnd-7.1.33-1.w7.x86_64.rpm- /root/php71w-opcache-7.1.33-1.w7.x86_64.rpm- /root/php71w-pdo-7.1.33-1.w7.x86_64.rpm- /root/php71w-pear-1.10.4-1.w7.noarch.rpm- /root/php71w-pecl-igbinary-2.0.5-1.w7.x86_64.rpm- /root/php71w-pecl-memcached-3.0.4-1.w7.x86_64.rpm- /root/php71w-pecl-mongodb-1.5.3-1.w7.x86_64.rpm- /root/php71w-pecl-redis-3.1.6-1.w7.x86_64.rpm- /root/php71w-process-7.1.33-1.w7.x86_64.rpm- /root/php71w-xml-7.1.33-1.w7.x86_64.rpmstate: present- name: copy php.ini to web_group  copy: src: php.inidest: /etc/php.ini- name: copy www.conf to web_groupcopy:src: www.confdest: /etc/php-fpm.d/www.conf- name: start and enable phpsystemd:name: php-fpmstate: startedenabled: yes- name: tar xf code.tar.gzunarchive:src: code.tar.gzdest: /creates: /code- name: chown -R www.www codefile:path: /codeowner: wwwgroup: www- hosts: nfs_grouptasks:- name: Install nfs-utilsyum:name: nfs-utilsstate: present- name: Scp NFS server exportscopy: src: exportsdest: /etc/exportsowner: rootgroup: rootmode: 0644- name: Create data Directoryfile:path: /datastate: directoryowner: wwwgroup: wwwmode: 0755recurse: yes- name: Create data Directoryfile:path: /data/wordpressstate: directoryowner: wwwgroup: wwwmode: 0755recurse: yes- name: Create data Directoryfile:path: /data/wecenterstate: directoryowner: wwwgroup: wwwmode: 0755recurse: yes- name: Create data Directoryfile:path: /data/phpshestate: directoryowner: wwwgroup: wwwmode: 0755recurse: yes- name: Start NFS serversystemd:name: nfs-serverstate: startedenabled: yes- hosts: web_grouptasks:- name: Install nfs-utilsyum:name: nfs-utilsstate: present- name: Mount wordpress_NFS Servermount:path: /code/wordpress/wp-admin/imagessrc: 10.0.0.31:/data/wordpressfstype: nfsopts: defaultsstate: mounted- name: Mount wecenter_NFS Servermount:path: /code/wecenter/uploads/src: 10.0.0.31:/data/wecenterfstype: nfsopts: defaultsstate: mounted- name: Mount phpshe_NFS Servermount:path: /code/phpshe/datasrc: 10.0.0.31:/data/phpshefstype: nfsopts: defaultsstate: mounted- hosts: mysql_grouptasks:- name: Install mariadb mysql-python redisyum:name: - mariadb-server- MySQL-python            - redisstate: present- name: Start httpd Serversystemd:name: mariadbstate: startedenabled: yes- name: Copy all.sql to Mysqlcopy:src: all.sqldest: /root/all.sql- name: import all.sqlmysql_db:login_host: localhostlogin_port: 3306login_user: rootname: allstate: importtarget: /root/all.sql- name: Restart MariaDB Serversystemd:name: mariadbstate: restarted- name: copy redis.conf to mysqlcopy: src: redis.confdest: /etc/redis.conf- name: start and redissystemd:name: redisstate: startedenabled: yes

3、剧本语法检查并执行 

将除了Ansible外的其他主机都恢复镜像,做好ssh免密钥

[root@Ansible ~]# ssh-keygen
[root@Ansible ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.0.0.4
[root@Ansible ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.0.0.5
[root@Ansible ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.0.0.6
[root@Ansible ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.0.0.7
[root@Ansible ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.0.0.8
[root@Ansible ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.0.0.31
[root@Ansible ~]# ssh-copy-id -i .ssh/id_rsa.pub root@10.0.0.51

检查并执行

[root@Ansible ~]# ansible-playbook -- ansible/lnmp/lnmp.yml[root@Ansible ~]# ansible-playbook ansible/lnmp/lnmp.yml

4、测试项目部署是否正常

windows进行hosts解析10.0.0.5,浏览器分别访问blog.koten.com;zh.koten.com;phpshe.koten.com;phpmyadmin.koten.com查看是否正常运行,查看phpmyadmin是否有会话保持,刷新phpmyadmin查看负载均衡。

注意:七层负载如果加证书的话,无法通过四层负载去访问到浏览器,因为Nginx在返回的时候七层需要先通过四层再返回给浏览器,带证书的请求无法转发给不带证书的请求,导致我们接收不到访问信息,但是看四层日志状态码是200;所以我们要么就是不用四层负载,要么取消七层负载的证书,但是用LVS可以解决这个问题,因为LVS是七层负载是直接返回给浏览器,不经过四层负载。


我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

相关文章:

【运维知识进阶篇】Ansible实现一套完整LNMP架构

前面介绍了PlayBook怎么写服务部署,把服务部署上后,我们来用Ansible来部署项目,实现一套完整的LNMP架构。我们部署wordpress、wecenter、phpshe、phpmyadmin这四个项目。将其所有的剧本都写入lnmp.yml中,相关备份数据都放入root/a…...

Spring Boot 自动配置一篇概览

一、什么是自动配置 bean 自动配置类通过添加 AutoConfiguration 注解实现。 因为 AutoConfiguration 注解本身是以 Configuration 注解的,所以自动配置类可以算是一个标准的基于 Configuration 注解的类。 Conditional 注解可以用于声明自动配置启用条件&#x…...

深入理解设计原则之接口隔离原则(ISP)【软件架构设计】

系列文章目录 C高性能优化编程系列 深入理解软件架构设计系列 深入理解设计模式系列 高级C并发线程编程 LSP:接口隔离原则 系列文章目录1、接口隔离原则的定义和解读2、案例解读3、如何判断一个接口是否符合接口隔离原则?小结 1、接口隔离原则的定义和…...

IMX6ULL裸机篇之I2C实验主控代码说明二

一. I2C实验 I2C实验内容: 学习如何使用 I.MX6U 的 I2C 接口来驱动 AP3216C,读取 AP3216C 的传感器数据。 I2C读写数据时序图: I2C写数据时序图如下: I2C读数据时序图如下: 二. I2C主控读写时序 1. 读数据与写数…...

【计算机组成原理与体系结构】数据的表示与运算

目录 一、进位计数制 二、信息编码 三、定点数数据表示 四、校验码 五、定点数补码加减运算 六、标志位的生成 七、定点数的移位运算 八、定点数的乘除运算 九、浮点数的表示 十、浮点数的运算 一、进位计数制 整数部分: 二进制、八进制、十六进制 --…...

如何入门编程

随着信息技术的快速发展,编程已经成为一个越来越重要的技能。那么,我们该如何入门编程呢?欢迎大家积极讨论 一、自学编程需要注意什么? 对于我个人的理解,其实自学编程最重要的就是兴趣。你得培养编程兴趣。 所以在学…...

SQL中CONVERT转化日期函数的使用方法

SQL中CONVERT转化日期函数的使用方法 SQL中CONVERT函数最常用的是使用convert转化长日期为短日期,如果只要取yyyy-mm-dd格式时间, 就可以用convert(nvarchar(10),field,120) 120 是格式代码, nvarchar(10) 是指取出前10位字符. 例如 SELECT CONVERT(nvarchar(10),…...

SpringBoot2-核心技术(一)

SpringBoot2-核心技术(一) 了解SpringBoot配置文件的使用 文章目录 SpringBoot2-核心技术(一)了解SpringBoot配置文件的使用一、文件类型1. properties2. yaml 二、yaml的基本使用1. 基本语法2. 数据类型2.1 字面量 2.2 对象2.3 …...

mac host学习

参考: SSH中known_hosts文件作用和常见问题及解决方法 https://blog.csdn.net/luduoyuan/article/details/130070120在 Mac 上更改 DNS 设置 https://support.apple.com/zh-cn/guide/mac-help/mh14127/mac mac中有时候你输入的域名,但会跳转到与期望ip不…...

Java之~指定String日期时间,5分钟一截取时间

// 截取5分钟时间Testpublic void timeCutForDay() throws ParseException {String startTime "2023-03-28 09:16:03";String endTime "2023-03-31 23:59:59";SimpleDateFormat dateFormat new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");D…...

【chatGPT4结对编程】chatGPT4教我做图像分类

开始接触深度学习 大语言模型火了之后,我也想过是否要加入深度学习的行业当中来,一开始的想法就是AI大模型肯定会被各大厂垄断,我们作为普通应用型软件工程师直接调用api就完事,另外对自己的学历也自卑(刚刚够线的二本&#xff0…...

Different romantic

001 他暗恋上我们班上的一个女生。 He has a crush on a girl in our class. crush n. 迷恋 have a crush on (someone) 暗恋(某人) crush 也可以指“暗恋的对象”。例如,“他在大学曾经暗恋过两个人”,英语就是He had two crushe…...

learn C++ NO.7——C/C++内存管理

引言 现在是5月30日的正午,图书馆里空空的,也许是大家都在午休,也许是现在37摄氏度的气温。穿着球衣的我已经汗流浃背,今天热火战胜了凯尔特人,闯入决赛。以下克上的勇气也激励着我,在省内垫底的大学中&am…...

SDUT数据库原理——第十章作业(参考答案)

1. 简述使用检查点方法进行数据恢复的一般步骤。 答: (1)使用检查点方法进行数据恢复,首先从重新开始文件(见P302页图10.3)中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录。 (2)由该检查点记录得到检查点建立时刻所有正在…...

My Note of Diffusion Models

Diffusion Models Links: https://theaisummer.com/diffusion-models/ Markovian Hierachical VAE rvs: data: x 0 x_{0} x0​,representation: x T x_{T} xT​ ( p ( x 0 , x 1 , ⋯ , x T ) , q ( x 1 , ⋯ , x T ∣ x 0 ) ) (p(x_0,x_1,\cdots,x_T),q(x_1,\cdots,x_{T…...

【P37】JMeter 仅一次控制器(Once Only Controller)

文章目录 一、仅一次控制器(Once Only Controller)参数说明二、测试计划设计2.1、测试计划一2.1、测试计划二 一、仅一次控制器(Once Only Controller)参数说明 可以让控制器内部的逻辑只执行一次;单次的范围是针对某…...

cleanmymac要不要下载装机?好不好用

当我们收到一台崭新的mac电脑,第一步肯定是找到一款帮助我们管理电脑运行的“电脑管家”,监控内存运行、智能清理系统垃圾、清理Mac大文件旧文件、消除恶意软件、快速卸载更新软件、隐私保护、监控系统运行状况等。基本在上mac电脑防护一款CleanMyMac就够…...

DNS风险分析及防护研究(五):常见的DNS威胁与防御(中科三方)

DNS是互联网运行重要的基础设施,在全球互联网运转中扮演重要作用。互联网中的每一次访问都开始于一次DNS查询,从而将人们更好辨识的域名转换为数字化的IP地址。随着互联网的快速发展以及网络技术的快速发展,DNS固有的缺陷逐步暴露出来&#x…...

使用geoserver发布shp和tiff数据

一、安装并启动geoserver服务 1.1 下载geoserver 进入官网下载 由于geoserver是使用Java语言开发的,所以运行需要java的环境,不同geoserver的版本号对java的版本要求不同,所以选择版本时需注意对应java的版本要求,由于我本地安…...

谷歌周彦祺:LLM浪潮中的女性科学家多面手丨智源大会嘉宾风采

导读 大模型研发竞赛如火如荼,谷歌紧随OpenAI其后推出PalM2、Gemini等系列模型。Scaling Law是否仍然适用于当下的大模型发展?科技巨头与初创企业在竞争中各有哪些优势和劣势?模型研究者应秉持哪些社会责任? 2023智源大会「基础模…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

如何为服务器生成TLS证书

TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...