centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解操作系统:centos7.2x86_ 64安装walle系统服务端1.以下安装,均在宿主机(一台配置了LAMP/LNMP的linux机器)上操作安装lnmp环境,建议使 用centos7yum安装,因为centos7yum源默认支持Php5.4以上版本,避免walle系统不兼容yuminsta ll-ymariadbmariadb-servernginxphpphp-bcmathphp-fpmphp-gd php-jsonfreetypefreetype-develphp-mbstringphp-mcryptphp-mys qlphp-opcachephp-pdophp-pdo_dblibphp-pgsqlphp-recodephp-snm pphp-soapphp-xmlphp-pecl-zipmhashlibmcryptlibmcrypt-devel2. 创建walle的web目录,我把web根目录配置成/data/www/walle-web(需要配置nginx指向,后面会详述)mk dir-p/data/www/walle-web&&cd/data/www/walle-web?#新建目录下载wal le-web-master.zip并解压(下载地址:https://github.com/meolu/walle-web)unzi pwalle-web-master.zipcdwalle-web-master3.设置mariadb数据库(mysql的操作一 样),只需要创建数据库,建表的操作交给walle的setup.php安装程序MariaDB[(none)]>createda tabasewallecharset=utf8mb4collateutf8mb4_unicode_ci;MariaDB[ (none)]>grantallprivilegesonwalle.to''walleuser''@''%''ident ifiedby''wallepass'';修改walle的web连接vim/data/www/walle-web/walle-w eb-master/config/local.php+14''db''=>[''dsn''???=>''mysql:hos t=127.0.0.1;dbname=walle'',#新建数据库walle''username''?=>''username'' ,?????????????#连接的用户名''password''?=>''password'',? ????????????#连接的密码],4.安装composer,如果已安装跳过curl-sShttp s://getcomposer.org/installer|phpmvcomposer.phar/usr/local/bi n/composer#PATH目录5.安装vendorcd/data/www/walle-web/walle-web-mas tercomposerinstall--prefer-dist--no-dev--optimize-autoloader -vvvv安装速度慢或失败,可直接下载vendor解压到项目根目录(即/data/www/walle-web/walle-web- master目录下)6.初始化项目cd/data/www/walle-web/walle-web-master./yiiwal le/setup#需要输入yes----------------------------------------------- ---------------------------------------createdir创建目录...mkdiring dir:/tmp/walle/mkdiringdir:/data/www/walle-web/walle-web-mast er/runtime/ansible_hosts/mkdiringdir:/data/www/walle-web/walle- web-master/vendor/bower/jquery/distsetwritable设置可写权限...Setting writable:/data/www/walle-web/walle-web-master/runtimeSettingwri table:/data/www/walle-web/walle-web-master/web/assetsSettingwri table:/tmp/walle/Settingwritable:/data/www/walle-web/walle-web -master/runtime/ansible_hosts/setexecutable设置可执行权限...Settingex ecutable:/data/www/walle-web/walle-web-master/yiiupdatedatabase 更新数据库:yiimigrate/up...YiiMigrationTool(basedonYiiv2.0.7 -dev)Creatingmigrationhistorytable"migration"...Done.Total17 newmigrationstobeapplied:m140328_144900_initm150926_151034_i nit_userm150927_061454_alter_conf_to_mysqlm150929_004629_change_r ecord_actionm150929_034627_session_to_mysqlm150929_115951_project _user_groupm151005_001053_alter_conf_2_projectm151010_050344_grou p_user_adminm151011_054352_task_need_more_longm151012_135612_task _add_branchm151014_115546_add_pre_release_taskm151018_032238_supp ort_svnm151027_063246_keep_version_numm160307_082032_ansiblem1604 02_173643_add_post_release_delaym160418_035413_user_status_migrat em160420_015223_add_file_transmission_modeApplytheabovemigrati ons?(yes|no)[no]:yesapplyingm140328_144900_init>createt ableuser...done(time:0.047s)>createtableconf...done(t ime:0.042s)>createtabletask...done(time:0.016s)>create tablerecord...done(time:0.018s)appliedm140328_144900_i nit(time:0.134s)applyingm150926_151034_init_user>insert into{{%user}}...done(time:0.006s)>insertinto{{%user}}.. .done(time:0.002s)appliedm150926_151034_init_user(time: 0.088s)applyingm150927_061454_alter_conf_to_mysql>dropcol umnconffromtableconf...done(time:0.050s)>addcolumngit _urlstring(200)DEFAULT""COMMENT"git地址"totableconf...don e(time:0.016s)>addcolumndeploy_fromstring(200)NOTNULLCO MMENT"宿主机存放clone出来的文件"totableconf...done(time:0.017s)>a ddcolumnexcludesstring(500)DEFAULT""COMMENT"要排除的文件"totab leconf...done(time:0.027s)>addcolumnrelease_userstring( 50)NOTNULLCOMMENT"目标机器用户"totableconf...done(time:0.059 s)>addcolumnrelease_tostring(200)NOTNULLCOMMENT"目标机器的目录, 相当于nginx的root,可直接web访问"totableconf...done(time:0.010s)>a ddcolumnrelease_librarystring(200)NOTNULLCOMMENT"目标机器版本发布库 "totableconf...done(time:0.018s)>addcolumnhostsstring (500)NOTNULLCOMMENT"目标机器列表"totableconf...done(time:0.0 16s)>addcolumnpre_deploystring(500)DEFAULT""COMMENT"部署前置 任务"totableconf...done(time:0.025s)>addcolumnpost_deplo ystring(500)DEFAULT""COMMENT"同步之前任务"totableconf...done (time:0.023s)>addcolumnpost_releasestring(500)DEFAULT""C OMMENT"同步之后任务"totableconf...done(time:0.020s)>addcolum ngit_typestring(50)DEFAULT"branch"COMMENT"两种上线方式,分支、tag"to tableconf...done(time:0.034s)>addcolumnauditsmallint(1 )DEFAULT0COMMENT"是否需要审核任务0不需要,1需要"totableconf...done(ti me:0.025s)>dropcolumncreated_atfromtableconf...done(ti me:0.012s)>addcolumncreated_atdatetimeCOMMENT"创建时间"after audittotableconf...done(time:0.022s)>addcolumnupdated _atdatetimeCOMMENT"修改时间"totableconf...done(time:0.014s) >dropcolumncreated_atfromtabletask...done(time:0.021s) >addcolumncreated_atdatetimeCOMMENT"创建时间"totabletask.. .done(time:0.011s)>addcolumnupdated_atdatetimeCOMMENT"修 改时间"totabletask...done(time:0.055s)appliedm150927_061 454_alter_conf_to_mysql(time:0.495s)applyingm150929_004629 _change_record_action>altercolumnactionintablerecordtoin teger(3)unsignedDEFAULT10COMMENT"任务执行到的阶段"...done(time:0 .021s)appliedm150929_004629_change_record_action(time:0.02 7s)applyingm150929_034627_session_to_mysql>createtablese ssion...done(time:0.005s)appliedm150929_034627_session_t o_mysql(time:0.012s)applyingm150929_115951_project_user_gr oup>createtablegroup...done(time:0.004s)>addcolumnava tarstring(100)DEFAULT"default.jpg"COMMENT"头像图片地址"AFTERemai ltotable{{%user}}...done(time:0.014s)appliedm150929_1 15951_project_user_group(time:0.023s)applyingm151005_00105 3_alter_conf_2_project>renametableconftoproject...done(t ime:0.004s)appliedm151005_001053_alter_conf_2_project(time :0.011s)applyingm151010_050344_group_user_admin>addcolum ntypesmallint(1)DEFAULT0COMMENT"用户在项目中的关系类型0普通用户,1管理员"to tablegroup...done(time:0.032s)>altercolumnuser_idinta blegrouptointeger(32)NOTNULLCOMMENT"用户id"...done(time: 0.013s)appliedm151010_050344_group_user_admin(time:0.051s) applyingm151011_054352_task_need_more_long>altercolumnex cludesintableprojecttotextCOMMENT"要排除的文件"...done(time: 0.013s)>altercolumnhostsintableprojecttotextCOMMENT"目标 机器列表"...done(time:0.015s)>altercolumnpre_deployintable projecttotextCOMMENT"部署前置任务"...done(time:0.013s)>alter columnpost_deployintableprojecttotextCOMMENT"同步之前任务"... done(time:0.012s)>altercolumnpost_releaseintableproject totextCOMMENT"同步之后任务"...done(time:0.015s)appliedm1510 11_054352_task_need_more_long(time:0.073s)applyingm151012_ 135612_task_add_branch>addcolumnbranchstring(100)DEFAULT"m aster"comment"选择上线的分支"totabletask...done(time:0.011s)> altercolumnnameintableprojecttostring(100)DEFAULT"master "comment"项目名字"...done(time:0.009s)appliedm151012_13561 2_task_add_branch(time:0.026s)applyingm151014_115546_add_p re_release_task>altercolumnpost_releaseintableprojecttot extCOMMENT"同步之前目标机器执行的任务"...done(time:0.003s)>renamecolu mnpost_releaseintableprojecttopre_release...done(time:0 .011s)>addcolumnpost_releasetextCOMMENT"同步之后目标机器执行的任务"AFT ERpre_releasetotableproject...done(time:0.013s)applie dm151014_115546_add_pre_release_task(time:0.033s)applying m151018_032238_support_svn>renamecolumngit_urlintableproje cttorepo_url...done(time:0.040s)>renamecolumngit_typei ntableprojecttorepo_mode...done(time:0.016s)>altercolu mnrepo_modeintableprojecttostring(50)DEFAULT"branch"COMM ENT"上线方式:branch/tag"AFTERrepo_url...done(time:0.015s)>ad dcolumnrepo_typestring(10)DEFAULT"git"COMMENT"上线方式:git/svn "AFTERrepo_modetotableproject...done(time:0.014s)>add columnrepo_usernamestring(50)DEFAULT""COMMENT"版本管理系统的用户名,一般 为svn的用户名"AFTERrepo_urltotableproject...done(time:0.013s) >addcolumnrepo_passwordstring(100)DEFAULT""COMMENT"版本管理系 统的密码,一般为svn的密码"AFTERrepo_usernametotableproject...done(ti me:0.037s)>addcolumnfile_listtextCOMMENT"文件列表,svn上线方式可能会产 生"totabletask...done(time:0.009s)>altercolumncommit_id intabletasktostring(100)DEFAULT""COMMENT"gitcommitid" ...done(time:0.010s)appliedm151018_032238_support_svn(ti me:0.159s)applyingm151027_063246_keep_version_num>addcol umnkeep_version_numinteger(3)NOTNULLDEFAULT20COMMENT"线上版本 保留数"AFTERaudittotableproject...done(time:0.012s)>addc olumnenable_rollbackinteger(1)NOTNULLDEFAULT1COMMENT"能否回滚 此版本:0no1yes"totabletask...done(time:0.011s)appliedm1 51027_063246_keep_version_num(time:0.030s)applyingm160307_ 082032_ansible>addcolumnansiblesmallint(3)NOTNULLDEFAULT 0COMMENT"是否启用Ansible0关闭,1开启"AFTERaudittotableproject... done(time:0.038s)appliedm160307_082032_ansible(time:0.05 9s)applyingm160402_173643_add_post_release_delay>addcolum npost_release_delayinteger(11)NOTNULLDEFAULT0COMMENT"每台目标 机执行post_release任务间隔/延迟时间单位:秒"AFTERpost_releasetotableprojec t...done(time:0.010s)appliedm160402_173643_add_post_rele ase_delay(time:0.015s)applyingm160418_035413_user_status_m igrate>altercolumnroleintable{{%user}}tosmallint(6)NOT NULLDEFAULT1...done(time:0.005s)>altercolumnstatusint able{{%user}}tosmallint(6)NOTNULLDEFAULT1...done(time: 0.003s)>update{{%user}}...done(time:0.006s)>update{{%us er}}...done(time:0.002s)>update{{%user}}...done(time:0 .002s)>update{{%user}}...done(time:0.003s)>update{{%use r}}...done(time:0.001s)appliedm160418_035413_user_status _migrate(time:0.028s)applyingm160420_015223_add_file_trans mission_mode>altercolumncreated_atintabletasktodatetime COMMENT"创建时间"AFTERenable_rollback...done(time:0.016s)>al tercolumnupdated_atintabletasktodatetimeCOMMENT"修改时间"AF TERcreated_at...done(time:0.052s)>addcolumnfile_transmis sion_modesmallint(3)NOTNULLDEFAULT1COMMENT"上线文件模式:1.全量所有文 件2.指定文件列表"AFTERbranchtotabletask...done(time:0.039s) appliedm160420_015223_add_file_transmission_mode(time:0.111s) Migratedupsuccessfully.---------------------------------------- ----------------------------------------------7.配置nginx刷新页面看到50x或 者404均是nginx配置不当,需要查看nginx日志nginx简单配置server{listen???80;ser ver_name?192.168.3.13;#改你的hostroot/data/www/walle-web/walle- web-master/web;#根目录为webindexindex.php;#建议放内网#allow192.16 8.0.0/24;#denyall;location/{try_files$uri$uri//index.ph p$is_args$args;}location~\.php${try_files$uri=404;fastc gi_pass?127.0.0.1:9000;fastcgi_param?SCRIPT_FILENAME?$docume nt_root$fastcgi_script_name;include????fastcgi_params;}}8.访 问地址:http://192.168.3.13当然,可能你配置nginx时的server_name是walle.chinasoft .com时,配置本地hosts之后,直接访问:walle.chinasoft.com亦可。管理员默认账户密码都为:admin至此w alle系统的部署告一段落walle系统的使用:几个术语:宿主机:walle服务安装所在的机器目标机:代码要分发到的机群ssh-k ey信任:可免密码登录,一个机器的一个用户与一个机器的一个用户通过ssh-key来建立信任(一般为RSA)实验环境:宿主机192 .168.3.13(部署了walle系统的服务器)目标机器192.168.3.17(需要部署web项目的环境)svn服务器19 2.168.3.18宿主机walle系统上的操作:1.安装ansible,需要ansible命令操作远程主机yuminstall -yansible添加用户www_php并设置成walleweb端php-fpm的运行用户,该用户主要是宿主机walle用来 操作项目部署(代码拉取、项目部署操作等的用户)useraddwww_phpecho''www_php''|passwd--st dinwww_phpvim/etc/php-fpm.d/www.conf#配置www_php有运行权限listen.owne r=www_phplisten.group=www_phpuser=www_phpgroup=www_php修改w alle_web目录权限,否则不可写chown-Rwww_php.www_php/data/www/walle-web2.把 宿主机的php进程用户的ssh-key添加到gitlab/github(svn不需要添加,直接使用访问svn的账号密码即可wall e有具体的配置界面),所有目标服务器机群,配置就完成了90%。确认宿主机的php进程用户:viphp-fpm.confuser =php-user??#看下用的是哪个用户psaux|grepphp-fpm#也是可以的2.获取宿主机的php 进程用户pwww_php的ssh-key并添加到目标主机信任su-php-usercat~/.ssh/id_rsa.pubp hp-user设置为no-login?先取消no-login,添加完ssh-key认证后再设置为no-loginsu–www. mntuku.cnssh-keygenssh-copy-id-i.ssh/id_rsa.pubrelease_user@1 92.168.3.17添加目标机器的信任[www_php@localhost~]$ssh-copy-id-i.ssh/id _rsa.pubrelease_user@192.168.3.17/usr/bin/ssh-copy-id:INFO:att emptingtologinwiththenewkey(s),tofilteroutanythatare alreadyinstalled/usr/bin/ssh-copy-id:INFO:1key(s)remainto beinstalled--ifyouarepromptednowitistoinstallthenew keysrelease_user@192.168.3.17''spassword:?Numberofkey(s)added: 1Nowtryloggingintothemachine,with:?"ssh''release_user@19 2.168.3.17''"andchecktomakesurethatonlythekey(s)youwante dwereadded.目标主机chown-Rrelease_user.release_user/data/wwwchmo d755-R/data/wwwuseraddrelease_userecho''release_user''|passwd --stdinrelease_user关于walle的错误调试:默认日志打印在/tmp/walle/目录下,centos7.2 没有这个日志目录原因:centos7yum安装的php-fpm默认/tmp目录不可写:/usr/lib/systemd/sy stem/php-fpm.service中的PrivateTmp=true禁止了向tmp目录写日志解决办法:mkdir/t mp/wallechmod777-R/tmpvim/usr/lib/systemd/system/php-fpm.serv ice?PrivateTmp=false重新加载配置生效systemctldaemon-reloadsystemctlrelo adphp-fpm对svn不熟悉的朋友可以看下:关于SVN的trunk、branch、tag相关概念,网上摘抄的文章——简单的对 比SVN的工作机制在某种程度上就像一颗正在生长的树:一颗有树干和许多分支的树?分支从树干生长出来,并且细的分支从相对较粗的树干中 长出?一棵树可以只有树干没有分支(但是这种情况不会持续很久,随着树的成长,肯定会有分支啦,^^)?一颗没有树干但是有很多分支的树看 起来更像是地板上的一捆树枝?如果树干患病了,最终分支也会受到影响,然后整棵树就会死亡?如果分支患病了,你可以剪掉它,然后其他分支还 会生长出来的哦!?如果分支生长太快了,对于树干它可能会非常沉重,最后整棵树会垮塌掉?当你感觉你的树、树干或者是分支看起来很漂亮的时 候,你可以给它照张相,这样就就可以记得它在那时是多么的赞。?——TrunkTrunk是放置稳定代码的主要环境,就好像一个汽车工厂 ,负责将成品的汽车零件组装在一起。以下内容将告诉你如何使用SVNtrunk:除非你必须处理一些容易且能迅速解决的BUG,或者你 必须添加一些无关逻辑的文件(比如媒体文件:图像,视频,CSS等等),否则永远不要在trunk直接做开发不要因为特殊的需求而去对先前 的版本做太大的改变,如何相关的情况都意味着需要建立一个branch(如下所述)不要提交一些可能破坏trunk的内容,例如从bran ch合并如果你在某些时候偶然间破坏了trunk,bringsomecakethenextday(”withgreat responsibilitiescome…hugecakes”)——Branches一个branch就是从一个SVN仓库 中的子树所作的一份普通拷贝。通常情况它的工作类似与UNIX系统上的符号链接,但是你一旦在一个SVNbranch里修改了一些文件, 并且这些被修改的文件从拷贝过来的源文件独立发展,就不能这么认为了。当一个branch完成了,并且认为它足够稳定的时候,它必须合并回 它原来的拷贝的地方,也就是说:如果原来是从trunk中拷贝的,就应该回到trunk去,或者合并回它原来拷贝的父级branch。以 下内容将告诉你如何使用SVNbranches:如果你需要修改你的应用程序,或者为它开发一个新的特性,请从trunk中创建一个新的branch,然后基于这个新的分支进行开发除非是因为必须从一个branch中创建一个新的子branch,否则新的branch必须从trunk创建当你创建了一个新branch,你应当立即切换过去。如果你没有这么做,那你为什么要在最初的地方创建这个分支呢?——Tags从表面上看,SVNbranches和SVNtags没有什么差别,但是从概念上来说,它们有许多差别。其实一个SVNtags就是上文所述的“为这棵树照张相”:一个trunk或者一个branch修订版的命名快照。以下内容将告诉你如何使用SVNtags:作为一个开发者,永远不要切换至、取出,或者向一个SVNtag提交任何内容:一个tag好比某种“照片”,并不是实实在在的东西,tags只可读,不可写。在特殊或者需要特别注意的环境中,如:生产环境(production)、?(staging)、测试环境(testing)等等,只能从一个修复过的(fixed)tag中checkout和update,永远不要commit至一个tag。对于上述提及到的环境,可以创建如下的tags:“production”,“staging”,“testing”等等。你也可以根据软件版本、项目的成熟程度来命名tag:“1.0.3”,“stable”,“latest”等等。当trunk已经稳定,并且可以对外发布,也要相应地重新创建tags,然后再更新相关的环境(production,staging,etc)——工作流样例假设你必须添加了一个特性至一个项目,且这个项目是受版本控制的,你差不多需要完成如下几个步骤:使用SVNcheckout或者SVNswitch从这个项目的trunk获得一个新的工作拷贝(branch)使用SVN切换至新的branch完成新特性的开发(当然,要做足够的测试,包括在开始编码前)一旦这个特性完成并且稳定(已提交),并经过你的同事们确认,切换至trunk合并你的分支至你的工作拷贝(trunk),并且解决一系列的冲突重新检查合并后的代码如果可能的话,麻烦你的同事对你所编写、更改的代码进行一次复查(review)提交合并后的工作拷贝至trunk如果某些部署需要特殊的环境(生成环境等等),请更新相关的tag至你刚刚提交到trunk的修订版本使用SVNupdate部署至相关环境 |
|