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

2023-10-29

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

1、准备工作

主机名称 主机IP(外网、内网) 作用
LB01 10.0.0.5、172.16.1.5 七层负载均衡、keepalived高可用
LB02 10.0.0.6、172.16.1.6 七层负载均衡、keepalived高可用
Web01 10.0.0.7、172.16.1.7 Nginx、php服务、存放代码文件
Web02 10.0.0.8、172.16.1.8 Nginx、php服务、存放代码文件
NFS 10.0.0.31、172.16.1.31 存放静态资源
MySQL 10.0.0.51、172.16.1.51 存放动态数据
Ansible 10.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 www
      group: 
        name: www
        gid: 666
    - name: create user www
      user:
        name: www
        uid: 666
        group: www
        shell: /sbin/nologin
        create_home: false
- hosts: nginx_install_group
  tasks:
    - name: nginx.repo
      copy:
        src: nginx.repo
        dest: /etc/yum.repos.d/nginx.repo
    - name: install nginx
      yum:
        name: nginx
        state: present
    - name: delete default.conf
      file:
        name: /etc/nginx/conf.d/default.conf
        state: absent
    - name: start and enable nginx
      systemd:
        name: nginx
        state: started
        enabled: yes

- hosts: keepalived_install_group
  tasks: 
    - name: copy nginx_lb01.conf
      copy:
        src: nginx_lb01.conf
        dest: /etc/nginx/nginx.conf
    - name: copy proxy_7.conf
      copy:
        src: proxy_7.conf
        dest: /etc/nginx/conf.d/proxy_7.conf
    - name: copy ssl_key to lb01 lb02
      copy:
        src: ssl_key
        dest: /etc/nginx/
    - name: copy proxy_params to lb01 lb02
      copy:
        src: proxy_params
        dest: /etc/nginx/proxy_params
    - name: restart nginx
      systemd:
        name: nginx
        state: restarted
    - name: install keepalived
      yum:
        name: keepalived   
        state: present
    - name: start and enable keepalived
      systemd:
        name: keepalived
        state: started
        enabled: yes

- hosts: lb01
  tasks: 
    - name: copy keepalived_lb01.conf
      copy:
        src: keepalived_lb01.conf
        dest: /etc/keepalived/keepalived.conf

- hosts: lb02
  tasks:
    - name: copy keepalived_lb02.conf
      copy: 
        src: keepalived_lb02.conf
        dest: /etc/keepalived/keepalived.conf          

- hosts: keepalived_install_group
  tasks:
    - name: restart keepalived
      systemd:
        name: keepalived
        state: restarted

- hosts: web_group
  tasks:
    - name: copy nginx_web.conf to web_group
      copy: 
        src: nginx_web.conf
        dest: /etc/nginx/nginx.conf
    - name: copy conf_web.d to web_group
      copy:
        src: conf_web.d/
        dest: /etc/nginx/conf.d
    - name: restart nginx
      systemd:
        name: nginx
        state: restarted
    - name: tar xf php to web_group
      unarchive:
        src: php71.tar.gz
        dest: /root
    - name: localinstall rpm
      yum:
        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.rpm
        state: present
    - name: copy php.ini to web_group  
      copy: 
        src: php.ini
        dest: /etc/php.ini
    - name: copy www.conf to web_group
      copy:
        src: www.conf
        dest: /etc/php-fpm.d/www.conf
    - name: start and enable php
      systemd:
        name: php-fpm
        state: started
        enabled: yes
    - name: tar xf code.tar.gz
      unarchive:
        src: code.tar.gz
        dest: /
        creates: /code
    - name: chown -R www.www code
      file:
        path: /code
        owner: www
        group: www

- hosts: nfs_group
  tasks:
    - name: Install nfs-utils
      yum:
        name: nfs-utils
        state: present
    - name: Scp NFS server exports
      copy: 
        src: exports
        dest: /etc/exports
        owner: root
        group: root
        mode: 0644
    - name: Create data Directory
      file:
        path: /data
        state: directory
        owner: www
        group: www
        mode: 0755
        recurse: yes
    - name: Create data Directory
      file:
        path: /data/wordpress
        state: directory
        owner: www
        group: www
        mode: 0755
        recurse: yes
    - name: Create data Directory
      file:
        path: /data/wecenter
        state: directory
        owner: www
        group: www
        mode: 0755
        recurse: yes
    - name: Create data Directory
      file:
        path: /data/phpshe
        state: directory
        owner: www
        group: www
        mode: 0755
        recurse: yes
    - name: Start NFS server
      systemd:
        name: nfs-server
        state: started
        enabled: yes

- hosts: web_group
  tasks:
    - name: Install nfs-utils
      yum:
        name: nfs-utils
        state: present
    - name: Mount wordpress_NFS Server
      mount:
        path: /code/wordpress/wp-admin/images
        src: 10.0.0.31:/data/wordpress
        fstype: nfs
        opts: defaults
        state: mounted
    - name: Mount wecenter_NFS Server
      mount:
        path: /code/wecenter/uploads/
        src: 10.0.0.31:/data/wecenter
        fstype: nfs
        opts: defaults
        state: mounted
    - name: Mount phpshe_NFS Server
      mount:
        path: /code/phpshe/data
        src: 10.0.0.31:/data/phpshe
        fstype: nfs
        opts: defaults
        state: mounted

- hosts: mysql_group
  tasks:
    - name: Install mariadb mysql-python redis
      yum:
        name: 
          - mariadb-server
          - MySQL-python            
          - redis
        state: present
    - name: Start httpd Server
      systemd:
        name: mariadb
        state: started
        enabled: yes
    - name: Copy all.sql to Mysql
      copy:
        src: all.sql
        dest: /root/all.sql
    - name: import all.sql
      mysql_db:
        login_host: localhost
        login_port: 3306
        login_user: root
        name: all
        state: import
        target: /root/all.sql
    - name: Restart MariaDB Server
      systemd:
        name: mariadb
        state: restarted
    - name: copy redis.conf to mysql
      copy: 
        src: redis.conf
        dest: /etc/redis.conf
    - name: start and redis
      systemd:
        name: redis
        state: started
        enabled: 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年运维经验,持续分享运维干货,感谢大家的阅读和关注!

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【运维知识进阶篇】Ansible实现一套完整LNMP架构 的相关文章

随机推荐

  • Linux访问ioctl访问失败的问题

    今天遇到一个ioctl访问失败的问题 做个记录 主要是用户态是32位 内核态时64位的 对于字符设备 内核中ioctl的挂接有不同 一 写64位driver驱动时 必须实现compat ioctl实现 用户态是32位时 会调用这个接口 否则
  • SpringBoot使用多线程

    一 概述 1 为什么使用多线程 在我们开发系统过程中 经常会处理一些好费时间的任务 如 向数据库中插入上百万数据 将会导致系统等待 这个时候就会自然想到使用多线程 2 为什么使用Spring来实现多线程 使用Spring比使用JDK原生的并
  • 企业人员信息管理(一)

    一 struts2和hibernate整合 1 整合 StrutsPrepareAndExecuteFilter作用详解 https blog csdn net clk esunny article details 80293978 过滤器
  • 跨境外贸业务,选择动态IP还是静态IP?

    在跨境业务中 代理IP是一个关键工具 它们提供了匿名的盾牌 有助于克服网络服务器针对数据提取设置的限制 无论你是需要经营管理跨境电商店铺 社交平台广告投放 还是独立站SEO优化 代理IP都可以让你的业务程度更加丝滑 达到事半功倍的效果 代理
  • python是不是面向对象的程序设计语言是_Python是一种面向对象程序设计语言

    Python是一种面向对象程序设计语言 答 正确 中国大学MOOC 构建人类命运共同体 要求在政治上 答 相互尊重 平等协商 成人膀胱空虚时膀胱尖不超过 答 耻骨联合上缘 课堂教学中常采用 读一读 议一议 练一练 讲一讲 的教学方式 这符合
  • 百度文心一言可以接入微信小程序啦!

    文心一言 英文名 ERNIE Bot 是百度全新一代知识增强大语言模型 文心大模型家族的新成员 能够与人对话互动 回答问题 协助创作 高效便捷地帮助人们获取信息 知识和灵感 接入小程序效果图 1 百度智能云 千帆大模型平台 注册登录账号 2
  • Qt Creator增强套装16.9.27.12更新

    HI 大家好 这里是jiangcaiyang 我们很高兴地告诉大家 我们将要发布Qt Creator增强套装新的版本了 这一次呢 主要是应大家强烈的要求 更新了我们的聊天神器 萌梦聊天室 现在它不再频繁地崩溃以及暂时性地无法回消息了 这个聊
  • docker安装seata

    下载seata docker镜像 docker pull seataio seata server 1 4 2 创建挂载目录和文件 mkdir p opt docker seata conf touch opt docker seata c
  • 创建老版本react-native项目,以0.59.10为例(0.60.0之前的版本)

    目录 创建react native 0 59 10版本项目前言 开始创建react native 0 59 10版本 创建react native 0 59 10版本项目前言 写这篇文章之前 有些东西要说明一下 当前rn的最新版本为 0 7
  • JavaFx转换为exe

    要点 首先导入依赖 在pom xml导入依赖 具体解释 而maven的两种方式 前者生成两个文件 程序jar包与复制所需的依赖jar包到lib目录 操作比较繁琐 而且在exe4j中进行打包的话会出现Caused by java lang N
  • JS基础知识(二十八):箭头函数

    1 箭头函数的使用 箭头函数有两种格式 一种只包含一个表达式 没有 和 return 一种包含多条语句 这个时候 return 就不能省略 箭头函数类型 代码 没有参数 gt 100 function return 10 一个参数 x gt
  • 使用Initramfs挂载根文件系统,编译过程multiple target patterns(多个目标匹配)问题的解决

    编译内核前 配置内核用Initramfs挂载根文件系统 配置选项如下 Genera setup gt Initial RAM filesystem and RAM disk initramfs initrd support home myr
  • 想要精通算法和SQL的成长之路 - 戳气球

    想要精通算法和SQL的成长之路 戳气球 前言 一 戳气球 1 1 记忆化搜索 前言 想要精通算法和SQL的成长之路 系列导航 一 戳气球 原题链接 首先我们看一下题干 对于超出了数组边界的 就当做它是一个数字为1的气球 遇到这种的 我们可以
  • POI设置EXCEL单元格的"条件格式"

    这篇博客主要是说明如何通过POI设置excle文档中单元格的条件格式 POI版本 poi 3 5 FINAL 涉及到的主要类 org apache poi hssf usermodel HSSFSheet org apache poi hs
  • SAN 网络配置规范

    管理网络的界定 为了统一起见 我们对管理网络进行如下界定 1 管理网络是指专门开辟一个用于管理的网络 主要用于 SAN 网 络设备的管理和调试 SAN 存储设备的管理和调试等 包括 BNA SAN 网络管理系统均使用管理网络 地址段为 X
  • Error when import grpc: "Symbol not found: _deflate"解决方法

    Import grpc时出现如下错误 Traceback most recent call last File private var tmp bazel lls 5ea0bb16383fa9c06c47b535a23ac475 execr
  • mybatis—plus

    接口和实现类都继承 如果你让你的服务接口继承 IService 并让你的服务实现类继承 ServiceImpl 那么你的服务接口将明确地列出所有可用的 CRUD 方法 只继承 ServiceImpl 如果你只让你的服务实现类继承 Servi
  • 【改进算法】【IHAOAVOA】天鹰优化算法和非洲秃鹫混合优化算法

    目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现 IHAOAVOA An improved hybrid aquila optimizer and African vultures optimizati
  • 深入理解Java并发之synchronized实现原理

    线程安全是并发编程中的重要关注点 应该注意到的是 造成线程安全问题的主要诱因有两点 一是存在共享数据 也称临界资源 二是存在多条线程共同操作共享数据 因此为了解决这个问题 我们可能需要这样一个方案 当存在多个线程操作共享数据时 需要保证同一
  • 【运维知识进阶篇】Ansible实现一套完整LNMP架构

    前面介绍了PlayBook怎么写服务部署 把服务部署上后 我们来用Ansible来部署项目 实现一套完整的LNMP架构 我们部署wordpress wecenter phpshe phpmyadmin这四个项目 将其所有的剧本都写入lnmp