學習Walle(一)

1、概述

Walle 一個web部署系統工具,配置簡單、功能完善、界面流暢、開箱即用!支持git、svn版本管理,支持各類web代碼發佈,PHP,Python,JAVA等代碼的發佈、回滾,能夠經過web來一鍵完成。php

功能列表:
用戶分身份註冊、登陸
開發者發起上線任務申請、部署
管理者審覈上線任務
支持多項目部署
支持多項目多任務並行
快速回滾
項目的用戶權限管理
部署前準備任務pre-deploy(前置檢查)
代碼檢出後處理任務post-deploy(如vendor)
同步後更新軟鏈前置任務pre-release
發佈完畢後收尾任務post-release(如重啓)
執行sql構建(不要擔憂忘記測試環境sql同步)
線上文件指紋確認
支持git、svn版本管理html

2、原理

宿主機、目標機羣、操做用戶關係以下圖所示,宿主機(walle所在的機器),是一箇中間機器,是代碼託管與遠程目標機羣的紐帶。因此宿主機須要與代碼託管(github/gitlab)和遠程目標機羣都創建ssh-key信任。前端

上線流程圖:java

3、安裝

環境說明:node

主機名            ip地址            部署                    系統
linux-node1    192.168.56.11    walle、LNMP    Centos 7.4 x86_64
linux-node2    192.168.56.12    LNMP            Centos 7.4 x86_64                
walle依賴於LAMP或者LNMP環境,在數據庫中建立walle庫:
create database walle;
grant all privileges on walle.* to walle@'%' identified by '123456';

1.代碼檢出

[root@linux-node1 ~]# mkdir -p /data/www/walle-web && cd /data/www/walle-web  # 新建目錄
[root@linux-node1 ~]# git clone git@github.com/meolu/walle-web.git .          # 代碼檢出

2.設置mysql鏈接

[root@linux-node1 walle-web]# vim config/local.php 
'db' => [
    'dsn'       => 'mysql:host=127.0.0.1;dbname=walle', # 新建數據庫walle
    'username'  => 'walle',                          # 鏈接的用戶名
    'password'  => '123456',                          # 鏈接的密碼
],

3.安裝composer

[root@linux-node1 ~]# curl -sS https://getcomposer.org/installer | php
[root@linux-node1 ~]# mv composer.phar /usr/local/bin/composer                # PATH目錄

4.安裝vendor

[root@linux-node1 www]# cd walle-web
[root@linux-node1 walle-web]# composer install --prefer-dist --no-dev --optimize-autoloader -vvvv

5.初始化項目

[root@linux-node1 walle-web]# ./yii walle/setup # 須要你的yes

6.配置nginx

[root@linux-node1 www]# vim /usr/local/nginx/conf/vhost/walle.conf 
server {
    listen       82;
    server_name  192.168.56.11; # 改你的host
    root /data/www/walle-web/web; # 根目錄爲web
    index index.php;

    # 建議放內網
    # allow 192.168.0.0/24;
    # deny all;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri = 404;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

默認用戶名密碼:Admin adminpython

4、配置項目

一、基本要求

宿主機php進程用戶www(假如,可經過配置的檢測查看或ps aux|grep php)的ssh-key要加入git/gitlab的deploy-keys。此處是www用戶的id_rsa.pub,添加到gitlab上的SSH-KEYSmysql

[www@linux-node1 ~]$ cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp/n0aWNws9KlFUTCFk7j1kSMz4mi8RVUl8amYuW/NNuuB9Ee3MRX0ZgJUgRpJDWM/xtHgCxAU9eg+3cTXCED7946aRaCY1ekK+eWfG+FiWzXLzDrUub2lJ071m3Pfsh6ExljwETObxiiSldrrgTStBbknYl/tTiGKM3vlGckVlDO8czUbpsLLot2ayQjQl3yHOhZcZbSkYk18i9MIp91fB3VPFhedyJfUJUouhiWJ4RjkbCdMCTCfBSMIxTNP9OvdjGmbDsG2+4YbfXZjQUJgwm9/oafAlpF1IQBdatnPFEL1QTocm+clt+EvyV2HpOksswx+UTHoJiZXdzuJaPAx www@linux-node1.example.com

宿主機php進程用戶www(假如,可經過配置的檢測查看或ps aux|grep php)要加入目標機羣部署用戶www_remote(配置中)ssh-key信任,也就是ssh-keys免祕鑰登錄linux

[www@linux-node1 ~]$ sh-copy-id -i ~/.ssh/id_rsa.pub www@192.168.56.12
[www@linux-node1 ~]$ ssh www@192.168.56.12
Last login: Thu Jan 25 10:30:45 2018 from linux-node1
[www@linux-node2 ~]$ 

二、配置項目

 

 這裏建立三個項目,能夠經過檢測來測試是否正常:nginx

注意:這裏3個項目的宿主機是linux-node1,因此在設置代碼檢出倉庫,統一爲一個倉庫便可,這裏設置爲/data/git,所屬也爲www用戶。檢測報錯,能夠經過報錯提示進行修改,一般的報錯有檢測代碼目錄、遠程代碼目錄所屬問題,gitlab的ssh-key認證問題,宿主機和遠程主機的ssh信任問題。c++

三、高級任務配置

高級任務方便用戶自定義一些操做,不管是在代碼檢出先後,仍是切換版本先後。
(1)Java配置實例

pre_deploy任務

echo pre_deploy >> /tmp/cmd        # 初始化一些東西,自由發揮
post_deploy任務

mvn package -Dmaven.test.skip=true # 編譯java
mvn clean                          # 打掃
mv WEB-INF/config.Properties.test WEB-INF/config.Properties # 切換環境相應的配置
rm -rf src                         # 甚至刪除無用代碼
pre_release任務

./xx.sh stop                       # 暫停服務
post_release任務

./xx.sh start                      # 啓動服務

5、Nginx虛擬主機配置

[root@linux-node2 app]# cd /etc/nginx/conf.d/
[root@linux-node2 conf.d]# ls
jxs.conf  wap.conf  www.conf
[root@linux-node2 conf.d]# cat www.conf 
   server {
        listen 80;
        server_name www.123.com;
        root /data/web/www;
        index index.html index.htm;
        access_log /var/log/nginx/eshop_access.log main;

    location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

}

[root@linux-node2 conf.d]# cat jxs.conf 
   server {
        listen 80;
        server_name jxs.123.com;
        root /data/web/jxs;
        index index.html index.htm;
        access_log /var/log/nginx/jxs_access.log main;

    location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

}
[root@linux-node2 conf.d]# cat wap.conf 
   server {
        listen 80;
        server_name m.123.com;
        root /data/web/wap;
        index index.html index.htm;
        access_log /var/log/nginx/wap_access.log main;

    location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

}
View Code

6、上線發佈

個人上線單-->建立上線單-->選擇項目

提交完成,點擊上線後,點擊部署便可發佈

下面能夠看到宿主機linux-node1中的檢出代碼庫的變化:

[root@linux-node1 git]# pwd
/data/git
[root@linux-node1 git]# tree 
.
└── test
    ├── jxs
    │?? └── index.html
    ├── wap
    │?? └── index.html
    └── www
        ├── app
        │?? ├── 1.txt
        │?? └── index.php
        ├── index.htm
        └── index.html

5 directories, 6 files

也能夠看到遠程目標主機的網站代碼目錄,都是經過軟鏈接的方式連接到發佈版本庫中的數據

 

[www@linux-node2 app]$ cd /data/web/
[www@linux-node2 web]$ ll
total 0
lrwxrwxrwx 1 www www 37 Jan 25 14:40 jxs -> /data/jxs/release/jxs/20180125-144001
lrwxrwxrwx 1 www www 37 Jan 25 14:40 wap -> /data/wap/release/wap/20180125-144026
lrwxrwxrwx 1 www www 37 Jan 26 09:45 www -> /data/www/release/www/20180126-094529
[www@linux-node2 web]$ 

總結:
walle發佈代碼實現,walle安裝在宿主機上,經過拉取gitlab上的代碼,然後經過rsync同步到遠程目標主機的代碼版本庫目錄中,遠程目標主機同時修改軟連接,連接到最新的代碼版本,回滾的操做也是經過連接不一樣的代碼版本庫中進行實現。

 

######################################################################

walle 2.0

walle官方文檔

一、walle原理

1.一、walle原理圖

walle有2個版本,walle 1.x版本使用PHP語言編寫,walle 2.x版本使用python重寫,兩個版本不相兼容。walle 2.0支持各類web代碼發佈,如php、java、python、go等代碼的發佈、回滾,均可以經過web UI一鍵完成。首先看一張walle的原理圖:

img

從上圖能夠看到左側部分是代碼託管的倉庫,如:git、svn等經常使用的倉庫類型。中間部分爲宿主機,宿主機用於部署walle發佈平臺,是代碼託管服務器和線上目標服務器的中間樞紐。因此這裏的宿主機,也能夠成爲經常使用語中的代碼發佈服務器。

宿主機既然做爲發佈服務器,則須要和代碼託管(github/gitlab/svn)以及遠程的目標服務器創建ssh-key信任。

1.二、權限設計模型

walle 2.x版本的權限角色分爲SUPER(超管)、OWNER(全部者)、MASTER(負責人)、DEVELOPER(開發者)、REPORTER(訪客)。其操做的資源包括:空間、項目、上線單(任務)、環境、用戶等。

permission

  • Super:walle的管理人員,負責平臺運維、開通空間並分配空間給owner

  • Owner:空間全部者,業務線負責,如大數據,新建項目並分配項目master,增長各方向leader做爲空間的master

  • Master:

    具體子方向leader:空間master做爲一個部門的具體子方向leader,管理該方向的服務器、項目等。爲Owner分擔具體事務。

    具體項目的leader:項目master做爲一個具體項目的leader,輔助Master審覈上線單等。

  • Developer:普通開發者,提交上線單、上線

  • Reporter:雞肋角色,不知道用來幹嗎

權限碼錶以下:

權限模型的解釋

  • 用戶的角色分爲兩種:space/role、project/role。空間的Master權限是空間級別,項目的Master權限是項目級別
  • 一個空間space下只有一個用戶組,由Owner管理,空間下的項目用戶權限繼承於空間用戶組。但也能夠單獨設定項目的用戶角色。
  • 一個用戶必須先分配一個空間,方可登陸系統。
  • 用戶全部操做均在登陸空間下,或有多個空間能夠切換

二、部署walle

須要注意的環境需求:

  • Linux + Bash(git、ssh)
    • 意味着不支持win,也不要裝在mac,兼容性問題
  • Python 3.5+ 和 Python 2.7+
  • MySQL 5.6.5以上,不然會在安裝時報錯
    • 在MySQL 5.6.5版本以前,Automatic Initialization and Updating只適用於TIMESTAMP,並且一張表中,最多容許一個TIMESTAMP字段採用該特性。從MySQL 5.6.5開始,Automatic Initialization and Updating同時適用於TIMESTAMP和DATETIME,且不限制數量。
  • 將全部目標主機 加入 宿主機(walle安裝所在機器)ssh免密登陸配置

2.一、依賴檢查安裝

  • 更換阿里源
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo 
yum clean all  
yum makecache
  • 安裝epel源
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
  • 安裝mariaDB
yum install -y mariadb-devel gcc gcc-c++ python-devel

2.二、walle部署

從安全性考慮,建議部署在內網!!!或者作其餘的訪問控制類型,避免出現安全性隱患問題。

  • 源碼下載
[root@localhost ~]# mkdir -pv /data/web/ && cd /data/web
[root@localhost web]# git clone https://github.com/meolu/walle-web.git #克隆walle 2.x源碼
  • 配置Nginx
[root@localhost web]# cd /usr/local/nginx/conf/vhost/
[root@localhost vhost]# cat walle.conf 
upstream webservers {
    server 192.168.56.11:5000 weight=1; #域名設置,須要配置python的訪問端口
}

server {
    listen       82;
    server_name  192.168.56.11;
    index index.php index.html index.htm;
    
    location / {
        try_files $uri $uri/ /index.html; add_header access-control-allow-origin *; root /data/web/walle-web/fe; # 前端代碼已集成到walle-web,即walle-web/fe的絕對路徑
    }

    location ^~ /api/ {
        add_header access-control-allow-origin *;
        proxy_pass      http://webservers;
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header    Origin        $host:$server_port;
        proxy_set_header    Referer       $host:$server_port;
    }

    location ^~ /socket.io/ {
        add_header access-control-allow-origin *;
        proxy_pass      http://webservers;
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header    Origin        $host:$server_port;
        proxy_set_header    Referer       $host:$server_port;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        # WebScoket Support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
  • 安裝
[root@localhost vhost]# cd /data/web/walle-web/
[root@localhost walle-web]# sh admin.sh init
 # 注意:安裝mysqlclient失敗,須要先安裝libmysqlclient-dev(ubuntu)
# 注意:安裝失敗請指定python路徑. mac 可能會有用anaconda的python,找到本身系統的python 2.7追加參數指定 -p /usr/bin/python2.7 便可
# vi admin.sh +20
# virtualenv --no-site-packages -p /usr/local/bin/python2.7 venv
  • 修改代碼中的配置,帶@TODO就是可能須要修改的地方
[root@localhost walle-web]# vim walle/config/settings_prod.py
# -*- coding: utf-8 -*-
""" walle-web Application configuration. 注意: 帶了 @TODO 的地方可能須要你的調整 :copyright: © 2015-2019 walle-web.io :created time: 2018-11-24 07:05:35 :author: wushuiyong@walle-web.io """

import os
from walle.config.settings import Config


class ProdConfig(Config):
    """Production configuration."""
    ENV = 'prod'
    DEBUG = False
    SQLALCHEMY_ECHO = False

    # 服務啓動 @TODO
    # HOST 修改成與 nginx server_name 一致.
    # 後續在web hooks與通知中用到此域名.
    HOST = '192.168.56.11'
    PORT = 5000
    # https True, http False
    SSL = False

    # 數據庫設置 @TODO
    SQLALCHEMY_DATABASE_URI = 'mysql://walle:walle@localhost:3306/walle?charset=utf8'

    # 本地代碼檢出路徑(用戶查詢分支, 編譯, 打包) #TODO
    CODE_BASE = '/tmp/walle/codebase/'

    # 日誌存儲路徑 @TODO
    # 默認爲walle-web項目下logs, 可自定義路徑, 需以 / 結尾
    # LOG_PATH = '/var/logs/walle/'
    LOG_PATH = os.path.join(Config.PROJECT_ROOT, 'logs')
    LOG_PATH_ERROR = os.path.join(LOG_PATH, 'error.log')
    LOG_PATH_INFO = os.path.join(LOG_PATH, 'info.log')
    LOG_FILE_MAX_BYTES = 100 * 1024 * 1024

    # 郵箱配置 @TODO
    MAIL_SERVER = 'smtp.exmail.qq.com'
    MAIL_PORT = 465
    MAIL_USE_SSL = True
    MAIL_USE_TLS = False
    MAIL_DEFAULT_SENDER = 'service@walle-web.io'
    MAIL_USERNAME = 'service@walle-web.io'
    MAIL_PASSWORD = 'Ki9y&3U82'
  • 數據庫配置和寫入數據

 MySQL 5.6.5以上,不然會在安裝時報錯。在MySQL 5.6.5版本以前,Automatic Initialization and Updating只適用於TIMESTAMP,並且一張表中,最多容許一個TIMESTAMP字段採用該特性。從MySQL 5.6.5開始,Automatic Initialization and Updating同時適用於TIMESTAMP和DATETIME,且不限制數量。

[root@localhost walle-web]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1007
Server version: 10.1.20-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database walle default charset utf8;

MariaDB [(none)]> grant all privileges walle.* to walle@"localhost" identified by "123456";

MariaDB [(none)]> flush privileges;

MariaDB [(none)]> quit;

[root@localhost walle-web]# sh admin.sh migration #數據遷移

[root@localhost walle-web]# sh admin.sh start #啓動

sh admin.sh restart # 重啓
sh admin.sh upgrade # 升級walle,升級完須要重啓walle服務。升級前最好 git stash 暫存本地修改,升級後git stash pop彈出暫存,而後重啓服務。
sh admin.sh migration # Migration

[root@localhost walle-web]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost walle-web]# systemctl reload nginx
  • 訪問:192.168.56.11:82。初始登陸帳號以下 :
超管:super@walle-web.io \ Walle123
全部者:owner@walle-web.io \ Walle123
負責人:master@walle-web.io \ Walle123
開發者:developer@walle-web.io \ Walle123
訪客:reporter@walle-web.io \ Walle123

PS:walle運行過程,以及部署過程出錯了,具體日誌能夠查看logs/runtime.log

三、Walle使用

3.一、用戶配置

  • Super視角 - 空間owner分配

    Super是個平臺管理員,主要負責walle運維,空間分配。更多的操做交由空間自行管理,分配完空間,添加全部用戶,使命就完成了。

  • Owner視角 - 用戶組配置

    Owner是空間下最高的權限,空間下的一切資源都可管理,包括把本身的空間出賣。

    空間的用戶組在空間內全局有效,項目均繼承此權限。

  • Owner視角 - 項目級用戶權限管理

    默認全部項目的權限繼承用戶組,但你可能須要不一樣的leader負責不一樣的項目,這個時候你就須要在項目上作更精細化的用戶權限配置。

廢話很少,先來建立一個用戶:用戶管理 --> 新建

建立一個空間,並分配給用戶:空間管理 --> 添加

3.二、項目配置

使用剛剛建立的用戶從新登陸,須要注意的是,新建立的用戶角色,是屬於Ownner。從新登陸以後,對項目中心進行配置,分配進行環境管理、服務器管理、項目管理

  • 環境管理新增

  • 服務器新增

這裏要注意的是,我用的是單臺服務器進行部署,也就是walle平臺和目標服務器都在一臺機子上的,若是宿主機和目標機不在同一臺機子上,是須要先進行配置ssh-key信任的。固然在同一臺機子上也須要先配置ssh-key信任。

  • 項目新增

這裏須要配置git的項目地址,因此是須要提早作好發佈機器和git倉庫的ssh-key信任。而且在目標集羣機器中須要建立倉庫存儲每次發佈的版本,用於回滾。命令以下:

[root@localhost ~]# mkdir /opt/shop/version -p

圖2還能夠進行一系列的任務配置

3.三、作一次上線流程

  • 新增開發者帳戶

按個人原意是想在Ownner角色下進行新增開發者帳戶,由於dev空間已經屬於我這個帳號,我只須要在個人帳號下添加一個子帳號進行開發項目便可。估計是系統權限管理不太完善,事與願違,在個人帳號下進行新增用戶,會提示如下錯誤:

回顧最初的說法,是一個用戶必須先分配一個空間,方可登陸系統。那麼只能在Super帳號下進行建立用戶,再進行添加項目的成員。在添加用戶的時候也會沒事就跳出提示網絡錯誤的bug,可是卻已經添加成功了,估計是代碼邏輯判斷的問題。將新建用戶添加到項目爲開發者:

  • 提交上線單

登陸張宇用戶,進行提交上線單,能夠看到做爲開發者,只有查看項目和提交上線單的權限:

  • Owner帳戶審覈

提交完成後,狀態會顯示:新建提交,然後須要Owner帳戶進行審覈。登陸帳號查看,如圖:

  • 上線

審覈經過之後,能夠直接點擊上線,也能夠經過開發者的帳號點擊上線,以下圖:

這裏須要注意的是,目標主機的nginx配置之類要事先配置好。然後在目標主機上查看變化:

[root@localhost ~]# ll /data/web/
lrwxrwxrwx  1 root root   38 Feb 22 11:50 shop -> /opt/shop/version/2_10_20190222_115008    
#使用軟鏈接的方式連接到版本
drwxr-xr-x 13 root root 4096 Feb 16 09:42 walle-web
root@localhost ~]# ll /opt/shop/version/ #查看代碼版本倉庫
total 0
drwxr-xr-x 3 root root 61 Feb 22 11:54 2_10_20190222_115008

這裏須要注意的是,若是不須要開發者參與,能夠在項目配置中,取消審覈,運維人員自行選擇最新版本進行發佈。有審覈的機制,是爲了更好地規範管理項目版本發佈的流程。

3.四、版本的回滾

在進行屢次發佈以後,也有錯漏,須要回滾。只須要進行點擊回滾,便可回滾到任意版本。

相關文章
相關標籤/搜索