热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

利用ansible来做tomcat应用的持续交付

https:www.jianshu.compfca8f91ae223在做持续交付这件事,想必大家都是用jenkins这款程序来做基石。当然,我们这次也是

https://www.jianshu.com/p/fca8f91ae223

在做持续交付这件事,想必大家都是用jenkins这款程序来做基石。当然,我们这次也是用jenkins作为承载工具,jenkins强大的插件是有目共睹的,有些ansible做起来不容易的事情交给jenkins反而简单有效。下面我会详细说明怎么持续交付tomcat应用。

希望本实验可以引导大家在持续交付的过程中使用ansible工具,也希望本实验能帮助到有需要的人,更希望给到大家一个简单的持续交付思想和启发。如想继续交流的,还请加入QQ群:425931784。

应用架构


本次使用的应用架构是常见的负载均衡实例。

image.png

软件版本


os: centos 6.7 X64
ansible: 2.3.1.0
python: 2.6.6
ant: 10.1
java: 1.8.0_13
tomcat: 8.5.14
jenkins: 2.73

Ansible roles


  • Ansible Role 系统环境 之【ant】
  • Ansible Role 系统环境 之【java】
  • Ansible Role 系统环境 之【iptables】
  • Ansible Role WEB 之【tomcat】
  • Ansible Role WEB 之【nginx】
  • Ansible Role 持续集成 之【jenkins】
  • Ansible Role 持续交付 之【deploy-tomcat】

服务器角色


主机角色
node1nginx,jenkins
node130tomcat
node131tomcat

集群搭建


本次使用anisble playbook

---- hosts: node130 node131vars:- java_version: "1.8"- tomcat_version: "8.5.14"- iptables_allowed_tcp_ports: ["8080"]roles:- java- { role: tomcat, java_home: "/usr/java/jdk1.8.0_131" } - iptables - hosts: node1 vars: - java_version: "1.8" - nginx_version: "1.12.1" - nginx_upstreams: - name: upstremtest servers: - 192.168.77.130:8080 max_fails=2 fail_timeout=2 - 192.168.77.131:8080 max_fails=2 fail_timeout=2 - nginx_vhosts: - listen: 80 locations: - name: / proxy_pass: http://upstremtest - jenkins_version: "2.73" - jenkins_plugins_extra: - ansible - ansicolor - iptables_allowed_tcp_ports: ["80","8080"] roles: - ant - java - nginx - jenkins - iptables tasks: - name: install ansible package: name=ansible

怎么使用ansible roles,请移步到 Ansible Role【怎么用?】

确保正常访问以下服务:

  • nginx http://192.168.77.129/lework
  • jenkins http://192.168.77.129:8080 帐号密码:admin/admin
  • tomcat http://192.168.77.130:8080/lework http://192.168.77.131:8080/lework

node1服务器操作


在服务器上配置ansible playbook

# cd /etc/ansible/
# cat tomcat-deploy.yml
---- hosts: allserial: 1roles:- deploy-tomcat# cat hosts
[node130]
192.168.77.130[node131]
192.168.77.131[testservers:children]
node130
node131[testservers:vars]
ansible_ssh_user=root
ansible_ssh_pass=123456# git clone https://github.com/kuailemy123/Ansible-roles.git /etc/ansible/roles/
# chown jenkins.jenkins /etc/ansible/

jenkins 操作


登录jenkins之后,设置工具
点击“系统管理”==》“Global Tool Configuration”

image.png
image.png
image.png

创建发布项目

image.png

 

配置参数化构建


image.png

配置源码仓库地址


image.png

repo: https://github.com/kuailemy123/AntSpringMVC.git

配置构建环境


image.png

配置编译

image.png

配置ansible

image.png

 

配置ansible变量


image.png

这里就不配置邮件通知了。

创建回滚项目

image.png

配置参数化构建


image.png

配置构建环境


image.png

配置ansible

image.png

配置anisble变量
image.png

 

测试


执行tomcat_deploy任务

选择发布的节点,默认all

任务执行的日志

Started by user admin
Building in workspace /var/lib/jenkins/workspace/tomcat_deploy
Cloning the remote Git repository
Cloning repository https://github.com/kuailemy123/AntSpringMVC.git> git init /var/lib/jenkins/workspace/tomcat_deploy # timeout=10
Fetching upstream changes from https://github.com/kuailemy123/AntSpringMVC.git> git --version # timeout=10> git fetch --tags --progress https://github.com/kuailemy123/AntSpringMVC.git +refs/heads/*:refs/remotes/origin/*> git config remote.origin.url https://github.com/kuailemy123/AntSpringMVC.git # timeout=10> git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10 > git config remote.origin.url https://github.com/kuailemy123/AntSpringMVC.git # timeout=10 Fetching upstream changes from https://github.com/kuailemy123/AntSpringMVC.git > git fetch --tags --progress https://github.com/kuailemy123/AntSpringMVC.git +refs/heads/*:refs/remotes/origin/* > git rev-parse refs/remotes/origin/master^{commit} # timeout=10 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10 Checking out Revision 989ea3a6549e16e3dd4cd329ab969b47658c9d67 (refs/remotes/origin/master) Commit message: "Create README.md" > git config core.sparsecheckout # timeout=10 > git checkout -f 989ea3a6549e16e3dd4cd329ab969b47658c9d67 First time build. Skipping changelog. [tomcat_deploy] $ ant -file build.xml -Ddeploy_node=all Buildfile: /var/lib/jenkins/workspace/tomcat_deploy/build.xml clean: [delete] Deleting directory /var/lib/jenkins/workspace/tomcat_deploy/war/WEB-INF/classes init: [mkdir] Created dir: /var/lib/jenkins/workspace/tomcat_deploy/target [mkdir] Created dir: /var/lib/jenkins/workspace/tomcat_deploy/war/WEB-INF/classes resolve: [echo] Getting dependencies... [ivy:retrieve] :: Apache Ivy 2.4.0 - 20141213170938 :: http://ant.apache.org/ivy/ :: [ivy:retrieve] :: loading settings :: url = jar:file:/usr/local/ant/lib/ivy-2.4.0.jar!/org/apache/ivy/core/settings/ivysettings.xml [ivy:retrieve] :: resolving dependencies :: org.apache#WebProject;working@node1 [ivy:retrieve] confs: [compile, runtime, test] [ivy:retrieve] found org.slf4j#slf4j-api;1.7.6 in public [ivy:retrieve] found jstl#jstl;1.2 in public [ivy:retrieve] found ch.qos.logback#logback-classic;1.1.2 in public [ivy:retrieve] found ch.qos.logback#logback-core;1.1.2 in public [ivy:retrieve] found org.springframework#spring-core;4.1.3.RELEASE in public [ivy:retrieve] found commons-logging#commons-logging;1.2 in public [ivy:retrieve] found org.springframework#spring-beans;4.1.3.RELEASE in public [ivy:retrieve] found org.springframework#spring-context;4.1.3.RELEASE in public [ivy:retrieve] found org.springframework#spring-aop;4.1.3.RELEASE in public [ivy:retrieve] found aopalliance#aopalliance;1.0 in public [ivy:retrieve] found org.springframework#spring-expression;4.1.3.RELEASE in public [ivy:retrieve] found org.springframework#spring-web;4.1.3.RELEASE in public [ivy:retrieve] found org.springframework#spring-webmvc;4.1.3.RELEASE in public [ivy:retrieve] downloading https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.6/slf4j-api-1.7.6.jar ... [ivy:retrieve] ............ (28kB) [ivy:retrieve] .. (0kB) ..... 省略下载的信息 [ivy:retrieve] :: resolution report :: resolve 74135ms :: artifacts dl 120701ms --------------------------------------------------------------------- | | modules || artifacts | | conf | number| search|dwnlded|evicted|| number|dwnlded| --------------------------------------------------------------------- | compile | 13 | 13 | 13 | 0 || 13 | 13 | | runtime | 13 | 13 | 13 | 0 || 13 | 13 | | test | 13 | 13 | 13 | 0 || 13 | 13 | --------------------------------------------------------------------- [ivy:retrieve] :: retrieving :: org.apache#WebProject [ivy:retrieve] confs: [compile, runtime, test] [ivy:retrieve] 13 artifacts copied, 0 already retrieved (5920kB/79ms) compile: [javac] Compiling 1 source file to /var/lib/jenkins/workspace/tomcat_deploy/war/WEB-INF/classes copy-resources: [copy] Copying 1 file to /var/lib/jenkins/workspace/tomcat_deploy/war/WEB-INF/classes package: [ivy:retrieve] :: retrieving :: org.apache#WebProject [ivy:retrieve] confs: [runtime] [ivy:retrieve] 0 artifacts copied, 13 already retrieved (0kB/5ms) [war] Building war: /var/lib/jenkins/workspace/tomcat_deploy/target/helloproject-20170819172002.war main: BUILD SUCCESSFUL Total time: 3 minutes 19 seconds [tomcat_deploy] $ /usr/bin/ansible-playbook /etc/ansible/tomcat-deploy.yml -i /etc/ansible/hosts -l all -f 5 -e deploy_port=8080 -e deploy_file=/var/lib/jenkins/workspace/tomcat_deploy/target/helloproject-*.war PLAY [all] ********************************************************************* TASK [Gathering Facts] ********************************************************* ok: [192.168.77.130] TASK [deploy-tomcat : check | 发布文件是否存在] **************************************** ok: [192.168.77.130] TASK [deploy-tomcat : check | 目标应用服务的家目录是否存在] ********************************** ok: [192.168.77.130] TASK [deploy-tomcat : check | 工作目录如果不存在则创建] ************************************ changed: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/new) changed: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/pre) changed: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/old) TASK [deploy-tomcat : deloy | 解压代码至目标服务器] ************************************** changed: [192.168.77.130] TASK [deploy-tomcat : deloy | 关闭服务] ******************************************** changed: [192.168.77.130] TASK [deploy-tomcat : deloy | 等待端口关闭] ****************************************** ok: [192.168.77.130] TASK [deploy-tomcat : deloy | 移动线上代码] ****************************************** changed: [192.168.77.130] TASK [deploy-tomcat : deloy | 部署最新代码] ****************************************** changed: [192.168.77.130] TASK [deploy-tomcat : deloy | 启动服务] ******************************************** changed: [192.168.77.130] TASK [deploy-tomcat : deloy | 等待端口开启] ****************************************** ok: [192.168.77.130] TASK [deploy-tomcat : verify | 查看http状态.] ************************************** ok: [192.168.77.130] TASK [deploy-tomcat : backup | 创建存储备份的文件夹] ************************************* changed: [192.168.77.130] TASK [deploy-tomcat : backup | 备份上线的代码] **************************************** changed: [192.168.77.130] TASK [deploy-tomcat : rollback | 检查/tmp/tomcat-ansible-snap/old是否存在代码] ********* skipping: [192.168.77.130] TASK [deploy-tomcat : rollback | 关闭服务] ***************************************** skipping: [192.168.77.130] TASK [deploy-tomcat : rollback | 等待端口关闭] *************************************** skipping: [192.168.77.130] TASK [deploy-tomcat : rollback | 部署上一版代码] ************************************** skipping: [192.168.77.130] TASK [deploy-tomcat : rollback | 启动服务] ***************************************** skipping: [192.168.77.130] TASK [deploy-tomcat : rollback | 等待端口开启] *************************************** skipping: [192.168.77.130] TASK [deploy-tomcat : verify | 查看http状态.] ************************************** skipping: [192.168.77.130] PLAY [all] ********************************************************************* TASK [Gathering Facts] ********************************************************* ok: [192.168.77.131] TASK [deploy-tomcat : check | 发布文件是否存在] **************************************** ok: [192.168.77.131] TASK [deploy-tomcat : check | 目标应用服务的家目录是否存在] ********************************** ok: [192.168.77.131] TASK [deploy-tomcat : check | 工作目录如果不存在则创建] ************************************ ok: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/new) ok: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/pre) ok: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/old) TASK [deploy-tomcat : deloy | 解压代码至目标服务器] ************************************** changed: [192.168.77.131] TASK [deploy-tomcat : deloy | 关闭服务] ******************************************** changed: [192.168.77.131] TASK [deploy-tomcat : deloy | 等待端口关闭] ****************************************** ok: [192.168.77.131] TASK [deploy-tomcat : deloy | 移动线上代码] ****************************************** changed: [192.168.77.131] TASK [deploy-tomcat : deloy | 部署最新代码] ****************************************** changed: [192.168.77.131] TASK [deploy-tomcat : deloy | 启动服务] ******************************************** changed: [192.168.77.131] TASK [deploy-tomcat : deloy | 等待端口开启] ****************************************** ok: [192.168.77.131] TASK [deploy-tomcat : verify | 查看http状态.] ************************************** ok: [192.168.77.131] TASK [deploy-tomcat : backup | 创建存储备份的文件夹] ************************************* changed: [192.168.77.131] TASK [deploy-tomcat : backup | 备份上线的代码] **************************************** changed: [192.168.77.131] TASK [deploy-tomcat : rollback | 检查/tmp/tomcat-ansible-snap/old是否存在代码] ********* skipping: [192.168.77.131] TASK [deploy-tomcat : rollback | 关闭服务] ***************************************** skipping: [192.168.77.131] TASK [deploy-tomcat : rollback | 等待端口关闭] *************************************** skipping: [192.168.77.131] TASK [deploy-tomcat : rollback | 部署上一版代码] ************************************** skipping: [192.168.77.131] TASK [deploy-tomcat : rollback | 启动服务] ***************************************** skipping: [192.168.77.131] TASK [deploy-tomcat : rollback | 等待端口开启] *************************************** skipping: [192.168.77.131] TASK [deploy-tomcat : verify | 查看http状态.] ************************************** skipping: [192.168.77.131] PLAY RECAP ********************************************************************* 192.168.77.130 : ok=14 changed=8 unreachable=0 failed=0 192.168.77.131 : ok=14 changed=7 unreachable=0 failed=0 Finished: SUCCESS

执行tomcat_rollback任务

image.png

选择回滚的节点,默认all

执行的日志

Started by user admin
Building in workspace /var/lib/jenkins/workspace/tomcat_rollback
[tomcat_rollback] $ /usr/bin/ansible-playbook /etc/ansible/tomcat-deploy.yml -i /etc/ansible/hosts -l all -f 5 -e deploy_rollback=truePLAY [all] *********************************************************************TASK [Gathering Facts] *********************************************************
ok: [192.168.77.130] TASK [deploy-tomcat : check | 发布文件是否存在] **************************************** skipping: [192.168.77.130] TASK [deploy-tomcat : check | 目标应用服务的家目录是否存在] ********************************** skipping: [192.168.77.130] TASK [deploy-tomcat : check | 工作目录如果不存在则创建] ************************************ skipping: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/new) skipping: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/pre) skipping: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/old) TASK [deploy-tomcat : deloy | 解压代码至目标服务器] ************************************** skipping: [192.168.77.130] TASK [deploy-tomcat : deloy | 关闭服务] ******************************************** skipping: [192.168.77.130] TASK [deploy-tomcat : deloy | 等待端口关闭] ****************************************** skipping: [192.168.77.130] TASK [deploy-tomcat : deloy | 移动线上代码] ****************************************** skipping: [192.168.77.130] TASK [deploy-tomcat : deloy | 部署最新代码] ****************************************** skipping: [192.168.77.130] TASK [deploy-tomcat : deloy | 启动服务] ******************************************** skipping: [192.168.77.130] TASK [deploy-tomcat : deloy | 等待端口开启] ****************************************** skipping: [192.168.77.130] TASK [deploy-tomcat : verify | 查看http状态.] ************************************** skipping: [192.168.77.130] TASK [deploy-tomcat : backup | 创建存储备份的文件夹] ************************************* skipping: [192.168.77.130] TASK [deploy-tomcat : backup | 备份上线的代码] **************************************** skipping: [192.168.77.130] TASK [deploy-tomcat : rollback | 检查/tmp/tomcat-ansible-snap/old是否存在代码] ********* changed: [192.168.77.130] TASK [deploy-tomcat : rollback | 关闭服务] ***************************************** changed: [192.168.77.130] TASK [deploy-tomcat : rollback | 等待端口关闭] *************************************** ok: [192.168.77.130] TASK [deploy-tomcat : rollback | 部署上一版代码] ************************************** changed: [192.168.77.130] TASK [deploy-tomcat : rollback | 启动服务] ***************************************** fatal: [192.168.77.130]: FAILED! => {"changed": true, "cmd": "/etc/init.d/tomcat start", "delta": "0:00:20.035003", "end": "2017-08-19 17:24:47.586469", "failed": true, "rc": 1, "start": "2017-08-19 17:24:27.551466", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []} ...ignoring TASK [deploy-tomcat : rollback | 等待端口开启] *************************************** ok: [192.168.77.130] TASK [deploy-tomcat : verify | 查看http状态.] ************************************** ok: [192.168.77.130] PLAY [all] ********************************************************************* TASK [Gathering Facts] ********************************************************* ok: [192.168.77.131] TASK [deploy-tomcat : check | 发布文件是否存在] **************************************** skipping: [192.168.77.131] TASK [deploy-tomcat : check | 目标应用服务的家目录是否存在] ********************************** skipping: [192.168.77.131] TASK [deploy-tomcat : check | 工作目录如果不存在则创建] ************************************ skipping: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/new) skipping: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/pre) skipping: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/old) TASK [deploy-tomcat : deloy | 解压代码至目标服务器] ************************************** skipping: [192.168.77.131] TASK [deploy-tomcat : deloy | 关闭服务] ******************************************** skipping: [192.168.77.131] TASK [deploy-tomcat : deloy | 等待端口关闭] ****************************************** skipping: [192.168.77.131] TASK [deploy-tomcat : deloy | 移动线上代码] ****************************************** skipping: [192.168.77.131] TASK [deploy-tomcat : deloy | 部署最新代码] ****************************************** skipping: [192.168.77.131] TASK [deploy-tomcat : deloy | 启动服务] ******************************************** skipping: [192.168.77.131] TASK [deploy-tomcat : deloy | 等待端口开启] ****************************************** skipping: [192.168.77.131] TASK [deploy-tomcat : verify | 查看http状态.] ************************************** skipping: [192.168.77.131] TASK [deploy-tomcat : backup | 创建存储备份的文件夹] ************************************* skipping: [192.168.77.131] TASK [deploy-tomcat : backup | 备份上线的代码] **************************************** skipping: [192.168.77.131] TASK [deploy-tomcat : rollback | 检查/tmp/tomcat-ansible-snap/old是否存在代码] ********* changed: [192.168.77.131] TASK [deploy-tomcat : rollback | 关闭服务] ***************************************** changed: [192.168.77.131] TASK [deploy-tomcat : rollback | 等待端口关闭] *************************************** ok: [192.168.77.131] TASK [deploy-tomcat : rollback | 部署上一版代码] ************************************** changed: [192.168.77.131] TASK [deploy-tomcat : rollback | 启动服务] ***************************************** changed: [192.168.77.131] TASK [deploy-tomcat : rollback | 等待端口开启] *************************************** ok: [192.168.77.131] TASK [deploy-tomcat : verify | 查看http状态.] ************************************** ok: [192.168.77.131] PLAY RECAP ********************************************************************* 192.168.77.130 : ok=8 changed=4 unreachable=0 failed=0 192.168.77.131 : ok=8 changed=4 unreachable=0 failed=0 Finished: SUCCESS

至此,持续交付实验就完成了,但是持续之路还是很漫长了。望大家永远前进。 大家也可在发的过程中,测试发布是否是灰度发布。

for i in `seq 10000`;do curl -s -I http://192.168.77.129 | head -1;sleep 1;done;



作者:lework
链接:https://www.jianshu.com/p/fca8f91ae223
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转:https://www.cnblogs.com/cheyunhua/p/8905814.html



推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • tcp/ip 高清大图
    为什么80%的码农都做不了架构师?转载于:https:my.oschina.netgsbhzb ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
author-avatar
这个昵称能用嘛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有