• Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署动态网站(7)


    项目前言

    在上一篇博客《Jenkins+Git+Gitlab+Ansible实现持续化集成一键部署静态网站(一)–技术流ken》中已经详细讲解了如何使用这四个工具来持续集成自动化部署一个静态的网站。

    如果大家可以熟练掌握以上内容,势必会在工作中减轻不小的工作量。

    本篇博客将再次使用这四个工具结合freestyle和pipeline来完成动态网站的部署。

    为了拓宽知识点,本篇博客将使用jenkins的两种常用方法来进行部署,如果你对pipeline还不熟悉,请参考我之前的博客《Jenkins凭证及任务演示-pipeline(二)–技术流ken》。

    虽说freestyle也可完成相同的操作,而且操作简单,但是freestyle只是适合服务器量很少的场景50-100台左右。如果你管理了百台、千台服务器势必会用到pipeline进行批量化操作。

    所以pipeline来还是应该深入去研究一下的,虽说确实有困难,但是因为它的格式相对固定单一,也不是可望而不可及。多学多练多总结。

    有关持续集成自动化部署系列差不多写了有十篇左右了。本篇博客将是这一系列的最后一篇,接下来会更新docker及k8s系列。敬请期待。

    项目需求

    需求一.、使用gitlab创建项目

    需求二、 使用ansible的roles实现一键化部署wordpress

    每次部署需要备份之前的网站数据

    使用roles

    使用templates

    脚本对网站监控检测

    需求三、 完成之后项目上传至gitlab

    需求四、使用jenkins实现项目的持续集成

    项目环境准备

    centos7

    Gitlab服务器: 10.220.5.137

    Ansible服务器: 10.220.5.139

    wordpress服务器1: 10.220.5.138

    防火墙以及selinux关闭状态

    Gitlab创建项目

    有关项目的创建我这里就不再赘述,大家可以参考我之前的博客《Gitlab在linux/windows中免密使用(二)–技术流ken

    我就直接拿我之前创建好的项目进行演示

    Git下载远程仓库内容

    在ansible服务器10.220.5.139上面操作

    第一步:创建目录并clone远程仓库内容

    复制代码
    [root@ken ~]# mkdir t
    [root@ken ~]# cd t
    [root@ken t]# git clone http://10.220.5.137/webg1/wordpress.git
    Cloning into 'wordpress'...
    Username for 'http://10.220.5.137': root
    Password for 'http://root@10.220.5.137': 
    remote: Counting objects: 1062, done.
    remote: Compressing objects: 100% (969/969), done.
    remote: Total 1062 (delta 68), reused 1042 (delta 68)
    Receiving objects: 100% (1062/1062), 4.15 MiB | 0 bytes/s, done.
    Resolving deltas: 100% (68/68), done.
    [root@ken t]# ls
    wordpress
    复制代码

    Ansible剧本的编写

    第一步:创建相关目录

    在ansible服务器端操作

    [root@ken ~]# mkdir /project/roles/wordpress/{vars,tasks,files,templates} -pv

    第二步:编写templates模版

    复制代码
    复制代码
      [root@ken ~]# cp /etc/httpd/conf/httpd.conf /project/roles/wordpress/templates/httpd.conf.j2
      [root@ken ~]# grep -v -E '^#|^$| +#' /project/roles/wordpress/templates/httpd.conf.j2
      ServerRoot "/etc/httpd"
      Listen {{ port }}    #定义成变量
      Include conf.modules.d/*.conf
      User {{ user }}       #定义成变量
      Group apache
      ServerAdmin root@localhost
      ServerName {{ ansible_eth0.ipv4.address }}  #引用内置变量
      DocumentRoot {{ root }}               #定义成变量
    复制代码
    复制代码

    第三步:编辑hosts配置文件

    [root@ken project]# vim /etc/ansible/hosts
    [devser]
    10.220.5.139

    第四步:编写测试文件

    [root@ken project]# vim roles/wordpress/files/index.php
    <?php
    phpinfo();
    ?>

    第五步:编写网站健康监测脚本

    复制代码
    复制代码
    [root@ken project]# cd roles/wordpress/files/
    [root@ken files]# ls
    [root@ken files]# vim check.sh 
    [root@ken files]# cat check.sh 
    #!/bin/bash
    URL=$1
    PORT=$2
    curl -I http://$1:$2/index.php | grep "200 OK" &>/dev/null
    if [ $? -eq 0 ];then
        echo "$1 status is ok"
    else
        echo "$1 status is not ok"
    fi
    复制代码
    复制代码

    第六步:编写tasks下的文件

    复制代码
    复制代码
    [root@ken wordpress]# cat tasks/main.yml
    ######## 安装 httpd php mysql ###############
    - name: install httpd
      yum: name=httpd state=present
    - name: install mysql
      yum: name=mariadb-server state=present
    - name: install php
      shell: yum install php php-mysql -y
    ######## 配置httpd #########################
    - name: make configrantion file
      template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    - name: install test page
      copy: src=index.php dest={{ root }}
    ######## 启动服务 ####################
    - name: start httpd
      service: name=httpd state=restarted
    - name: start mysql
      service: name=mariadb state=restarted
    ######### 检查部署结果是否正常 ##########
    - name: make health check
      shell: sh roles/wordpress/files/check.sh {{ ansible_eth0.ipv4.address }} {{ port }}
      delegate_to: localhost
      register: health_status
    - debug: msg="{{ health_status.stdout }}"
    ########## 从gitlab拉取代码 #################
    - name: backup old files
      shell: mv {{ root }} {{ backup_to }}
    - name: close ssl authtication
      shell: git config --global http.sslVerify false
    - name: git clone wordpress from gitlab
      git: "repo=http://{{ gitlab_user }}:{{ gitlab_pass }}@10.220.5.137/webg1/wordpress.git dest={{ root }} version=master"
    复制代码
    复制代码

    第七步:编写vars下的文件

    [root@ken ~] # cat /project/roles/wordpress/vars/main.yml
    port: 82
    user: apache
    root: /var/www
    gitlab_user: root
    gitlab_pass: 12345678

    第八步:编辑剧本

    剧本一定要和roles在同一个目录之中

    执行剧本的时候也要在roles同级目录下执行

    [root@ken ~]# vim /project/wordpress.yaml
    - hosts: all
      vars:
         backup_to: "{{ root }}_{{ ansible_date_time.epoch }}"
      roles:
       - wordpress

    第九步:一键部署wordpress

    [root@ken ~]# cd /project/
    [root@ken project]# ansible-playbook -i inventory/dev dev.yaml

    第十步:查看执行结果

    可以发现没有报错

    复制代码
    [root@ken project]# ansible-playbook -i inventory/den dev.yaml 
     [WARNING]: Found variable using reserved name: port
    
    
    PLAY [all] ***********************************************************************
    
    TASK [Gathering Facts] ***********************************************************
    ok: [10.220.5.138]
    
    TASK [wordpress : install httpd] *************************************************
    ok: [10.220.5.138]
    
    TASK [wordpress : install mysql] *************************************************
    ok: [10.220.5.138]
    
    TASK [wordpress : install php] ***************************************************
     [WARNING]: Consider using the yum module rather than running yum.  If you need
    to use command because yum is insufficient you can add warn=False to this command
    task or set command_warnings=False in ansible.cfg to get rid of this message.
    
    changed: [10.220.5.138]
    
    TASK [wordpress : make configrantion file] ***************************************
    ok: [10.220.5.138]
    
    TASK [wordpress : install test page] *********************************************
    ok: [10.220.5.138]
    
    TASK [wordpress : start httpd] ***************************************************
    changed: [10.220.5.138]
    
    TASK [wordpress : start mysql] ***************************************************
    ok: [10.220.5.138]
    
    TASK [wordpress : make health check] *********************************************
    changed: [10.220.5.138 -> localhost]
    
    TASK [wordpress : debug] *********************************************************
    ok: [10.220.5.138] => {
        "msg": "10.220.5.138 status is ok"
    }
    
    TASK [wordpress : backup old files] **********************************************
    changed: [10.220.5.138]
    
    TASK [wordpress : close ssl authtication] ****************************************
    changed: [10.220.5.138]
    
    TASK [wordpress : git clone wordpress from gitlab] *******************************
    changed: [10.220.5.138]
    
    PLAY RECAP ***********************************************************************
    10.220.5.138               : ok=13   changed=6    unreachable=0    failed=0
    复制代码

    数据上传至Gitlab

    第一步:上传所以数据至远程gitlab

    复制代码
    [root@ken project]# cd ..
    [root@ken wordpress]# ls
    da  project  wordpress
    [root@ken wordpress]# ls -a
    .  ..  da  .git  project  wordpress
    [root@ken wordpress]# git add .
    [root@ken wordpress]# git commit -m "v3"
    [master e533bc1] v3
     2 files changed, 3 insertions(+)
     create mode 100644 project/dev.retry
     create mode 100644 project/inventory/den
    [root@ken wordpress]# git push
    复制代码

    第二步:web端查看

    可以看到现在已经有了我们刚才已经上传的v3版本了

    Jenkins端实现持续集成部署–freestyle

    第一步:创建一个freestyle的任务

    第二步:填写gitlab仓库信息

    第三步:构建shell

    填写如下信息并保存

    这里之所以要先cd到工作目录下的project是因为要找到dev.yaml剧本

    第四步:开始构建

    可以发现已经部署完成

    Jenkins端实现持续集成部署–pipeline

    第一步:创建一个流水线即pipeline任务

    第二步:编写pipeline

    如果你是复制的下面的代码请务必更改你的git路径以及指定你的凭证ID

    复制代码
    #!groovy
    
    pipeline {
     agent {node {label 'master'}}
    
     environment {
      PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"
     }
    
     parameters {
      choice(
       choices: 'dev
    rprod',
       description: 'Choose deploy environment',
       name: 'deploy_env'
      )
      string (name: 'branch', defaultValue: 'master', description: 'Fill in your ansible repo branch')
     }
    
     stages {
      stage ("Pull deploy code") {
       steps{
        sh 'git config --global http.sslVerify false'
        dir ("${env.WORKSPACE}"){
         git branch: 'master', credentialsId: '527d840a-ad47-4a16-bfa1-c6eab88a3563', url: 'http://10.220.5.137/webg1/wordpress.git'
        }
       }
    
      }
    
      stage ("Anisble deployment") {
       steps {
        dir("${env.WORKSPACE}"){
         echo "[INFO] Start deployment"
         sh """
         set +x
         ansible-playbook -i inventory/$env ./dev.yaml -e branch=$branch -e env=$deploy_env
         set -x
         """
         echo "[INFO] Deployment finished..."
        }
       }
      }
    
     }
    
    }
    复制代码

    第三步:查看执行结果

    发现执行成功

    以后程序员更改代码之后就可以自己测试上线了

    第四步:数据库授权

    复制代码
    [root@ken ~]# mysql -uroot -p
    Enter password: 
    Welcome to the MariaDB monitor.  Commands end with ; or g.
    Your MariaDB connection id is 4
    Server version: 5.5.56-MariaDB MariaDB Server
    
    Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    MariaDB [(none)]> create database wordpress;
    Query OK, 1 row affected (0.03 sec)
    
    MariaDB [(none)]> grant all on *.* to ken@'localhost' identified by '123';
    Query OK, 0 rows affected (0.02 sec)
    
    MariaDB [(none)]> exit
    Bye
    复制代码

    第五步:填写上面数据库配置的信息

    第六步:配置成功页面

    注意访问的时候IP地址之后需要加上:82端口号,因为我们上面的剧本中指定了变量port为82号端口

  • 相关阅读:
    JavaScript HTML DOM 事件监听器
    点击 和 松开鼠标 触发函数
    当鼠标移动过来 or 鼠标移开 触发函数
    onchange 事件(当焦点不在input框触发函数 )
    把2张表的数据合并成一张表
    Dome操作
    字典里面 值对应是函数的用法
    全局变量和局部变量的问题
    try catch finally 捕获异常的方法
    js 正则
  • 原文地址:https://www.cnblogs.com/it-peng/p/11399436.html
Copyright © 2020-2023  润新知