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的原理圖:
從上圖能夠看到左側部分是代碼託管的倉庫,如:git、svn等經常使用的倉庫類型。中間部分爲宿主機,宿主機用於部署walle發佈平臺,是代碼託管服務器和線上目標服務器的中間樞紐。因此這裏的宿主機,也能夠成爲經常使用語中的代碼發佈服務器。
宿主機既然做爲發佈服務器,則須要和代碼託管(github/gitlab/svn)以及遠程的目標服務器創建ssh-key信任。
1.二、權限設計模型
walle 2.x版本的權限角色分爲SUPER(超管)、OWNER(全部者)、MASTER(負責人)、DEVELOPER(開發者)、REPORTER(訪客)。其操做的資源包括:空間、項目、上線單(任務)、環境、用戶等。
-
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)
- 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
yum install -y https:
yum install -y mariadb-devel gcc gcc-c++ python-devel
2.二、walle部署
從安全性考慮,建議部署在內網!!!或者作其餘的訪問控制類型,避免出現安全性隱患問題。
[root@localhost ~]
[root@localhost web]
[root@localhost web]
[root@localhost vhost]
upstream webservers {
server 192.168.56.11:5000 weight=1;
}
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;
}
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;
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]
""" 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
HOST = '192.168.56.11'
PORT = 5000
SSL = False
SQLALCHEMY_DATABASE_URI = 'mysql://walle:walle@localhost:3306/walle?charset=utf8'
CODE_BASE = '/tmp/walle/codebase/'
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
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]
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]
[root@localhost walle-web]
sh admin.sh restart
sh admin.sh upgrade
sh admin.sh migration
[root@localhost walle-web]
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]
- 訪問: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帳戶進行審覈。登陸帳號查看,如圖:
審覈經過之後,能夠直接點擊上線,也能夠經過開發者的帳號點擊上線,以下圖:
這裏須要注意的是,目標主機的nginx配置之類要事先配置好。然後在目標主機上查看變化:
[root@localhost ~]
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 ~]
total 0
drwxr-xr-x 3 root root 61 Feb 22 11:54 2_10_20190222_115008
這裏須要注意的是,若是不須要開發者參與,能夠在項目配置中,取消審覈,運維人員自行選擇最新版本進行發佈。有審覈的機制,是爲了更好地規範管理項目版本發佈的流程。
3.四、版本的回滾
在進行屢次發佈以後,也有錯漏,須要回滾。只須要進行點擊回滾,便可回滾到任意版本。