Powershell 的自己主动部署
工作中反复性的版本号移植,一天上线10几次,让我痛不欲生,频繁的操作也可能出现疲劳性失误,导致严重的生产故障。于是乎,闲暇时间。我開始研究使用powershell自己主动部署程序到Linuxserver。
脚本中涉及到下面工具:
1、Wincp:借助其自身的命令行模式完毕程序部署
2、powershell的ssh-session模块。通过载入该模块连接到Linuxserver,运行相关shell命令
3、.net
開始上代码
#Public environment configure
$script:linuxPath="D:\test\newpath.txt"
$script:parentPath="D:\test\"
$script:parentPath2=$parentPath -replace "\\","/"
$script:projectConfigureFile="D:\test\projectConfigureFile.csv"
#运行shell函数
function Exec-Bash($computers,$user,$pwd,$linux_command){
#Check SshSessions Module
$modules=Get-Command -Module ssh-sessions
if($modules -eq $null){
Import-Module ssh-sessions
}
if($computers.GetType().IsArray){
foreach($computer in $computers){
$sshsession=Get-SshSession|?{$_.computername -eq $computer}
if($sshsession.Connected -ne "true"){
New-SshSession -ComputerName $computer -Username $user -Password $pwd -ErrorAction Stop
}
Invoke-SshCommand -ComputerName $computer -Quiet -Command $Linux_command
}
}else{
$sshsession=Get-SshSession|?
{$_.computername -eq $computers}
if($sshsession -eq $null){
New-SshSession -ComputerName $computers -Username $user -Password $pwd -ErrorAction Stop
}
Invoke-SshCommand -ComputerName $computers -Quiet -Command $Linux_command
}
Remove-Item $linuxPath
}
#回收session函数
function Recycle-Session{
param($computers)
if($computers.GetType().IsArray){
foreach($c in $computers){
Remove-SshSession -ComputerName $c | out-null
}
}else{
Remove-SshSession -ComputerName $computers | out-null
}
}
#解密函数。主要用于解密server登录password
function Decrypt-String($Encrypted, $Passphrase, $salt="SaltCrypto", $init="IV_Password"){
if($Encrypted -is [string]){
$Encrypted = try{[Convert]::FromBase64String($Encrypted)}catch{return $false}
}
$r = new-Object System.Security.Cryptography.RijndaelManaged
$pass = [Text.Encoding]::UTF8.GetBytes($Passphrase)
$salt = [Text.Encoding]::UTF8.GetBytes($salt)
$r.Key = (new-Object Security.Cryptography.PasswordDeriveBytes $pass, $salt, "SHA1", 5).GetBytes(32) #256/8
$r.IV = (new-Object Security.Cryptography.SHA1Managed).ComputeHash( [Text.Encoding]::UTF8.GetBytes($init) )[0..15]
$d = $r.CreateDecryptor()
$ms = new-Object IO.MemoryStream @(,$Encrypted)
$cs = new-Object Security.Cryptography.CryptoStream $ms,$d,"Read"
$sr = new-Object IO.StreamReader $cs
Write-Output $sr.ReadToEnd()
$sr.Close()
$cs.Close()
$ms.Close()
$r.Clear()
}
#在Windows环境下创建备份信息
function Creat-Path{
Clear-Content $linuxPath -ErrorAction SilentlyContinue
$toLinuxPath=dir -r $parentPath |%{$_.versioninfo}|select filename
$n=""
foreach($p in $toLinuxPath){
$newPath=$p.filename -replace "\\","/"|%{$_ -replace $parentPath2,""}
foreach($newP in $newPath){
$n=$n + ' ' + $newp
}
}
$n=$n -replace 'newpath.txt',''
$n > $linuxPath
$n=""
}
#上传操作
function Upload{
$projectNames=dir -Directory $parentPath|%{$_.Name}
if($projectNames -eq $null){
Write-Warning "$parentPath 中没有须要操作的项目信息。请确认后再运行"
pause
break
}
if($projectNames.GetType().IsArray){
Write-Warning 为避免误操作。请逐个项目备份移植,谢谢!
pause
break
}else{
$projectConfigureInfo=Import-Csv $projectConfigureFile|?{$_.project -eq $projectNames}
if($projectConfigureInfo -ne $null){
$project=$projectConfigureInfo.project
$computers=$projectConfigureInfo.iplist
$port=$projectConfigureInfo.port
$user=$projectConfigureInfo.account
$passwd=Decrypt-String $projectConfigureInfo.passwd "MyStrongPassword"
$webpath=$projectConfigureInfo.webpath
#创建备份信息
Creat-Path
$question=Read-Host 备份信息已拼接完毕。是否登录到server进行备份(Y/N)
switch($question){
Y{
#连接到server运行备份命令
if($computers.IndexOf(',') -gt 0){
$computers=$computers -split ","
}
$sourcePath=gc $linuxPath
$linux_command="cd $webpath;/sbin/backup $sourcePath"
#Exec-Bash $computers[0] $user $passwd $linux_command
Recycle-Session $computers
if($?){
Write-Host 文件备份已完毕 -ForegroundColor Green
Remove-Item $linuxPath -Force -ErrorAction Stop
}
break
}
N{return $false}
default{return $false}
}
#准备移植
Write-Host "$projectNames 项目配置信息例如以下:" -ForegroundColor Yellow
$projectConfigureInfo|select project,iplist,port,account,webpath|ft
$rh=Read-Host 请确认是否開始上传文件(Y/N)
switch($rh){
Y{
if($computers.gettype().isarray){
foreach($computer in $computers){
$openstr="open"+" sftp://"+$user+":"+$passwd+"@"+$computer+":"+$port
D:\Tools\winscp520\WinSCP.exe /console /command "option batch continue" "option confirm off" $openstr "option transfer binary" "put $parentPath*" #"exit"
}
}else{
$openstr="open"+" sftp://"+$user+":"+$passwd+"@"+$computers+":"+$port
D:\Tools\winscp520\WinSCP.exe /console /command "option batch continue" "option confirm off" $openstr "option transfer binary" "put $parentPath*" #"exit"
}
break
}
N{return $false}
default{return $false}
}
}else{
Write-Warning "没有匹配到项目 $projectNames 的配置信息。请检查配置文件 $script:projectConfigureFile"
pause
break
}
}
}
Upload
#>
Powershell 的自己主动部署的更多相关文章
- 菜鸟教程工具(三)——Maven自己主动部署Tomcat
书连接至背面,在博客上,他介绍了如何使用Maven该项目包,这篇文章说,关于如何使用Maven会踢war部署包Tomcat.而不是手动copy过去. 眼下比較流行的方式有两种:一种是利用Tomcat官 ...
- 【大话QT之十三】系统软件自己主动部署实现方案
本篇文章是对[大话QT之十二]基于CTK Plugin Framework的插件版本号动态升级文章的补充,在上篇文章中我们阐述的重点是新版本号的插件已经下载到plugins文件夹后应该怎样更新本地正在 ...
- Eclipse中的Web项目自己主动部署到Tomcat
一.原因. 1.写java程序有一段时间了,但非常久没用eclipse了.所以使用eclipse编写的web项目部署到tomcat 的方式也不是非常清楚,以下记录一下将Eclipse 上的web项目自 ...
- SVN配置以及自己主动部署到apache虚拟文件夹
SVN配置以及自己主动部署到apache虚拟文件夹 一.VisualSVN server 服务端和TortoiseSVNclient下载 VisualSVN下载:http://subversion.a ...
- MAVEN自己主动部署到tomcat
前面几篇文章maven生成的war包都是手动部署到tomcat,显然这样是非常麻烦的.那么这一篇文章就来介绍一个怎样使用maven高速自己主动的部署项目到tomcat容器中. 1.首先我们须要配置to ...
- 【转】Powershell与jenkins集成部署的运用(powershell运用)
powershell简介: 远程管理采用的一种新的通信协议,Web Services for Management,简称WS-MAN它通过http或者https进行工作,WS-WAN的实现主要基于一个 ...
- Eclipse中的Web项目自己主动部署到Tomcat以及怎样在Eclipse中使用My Eclipseproject
我是一个新手学习Java,servlet和Jsp. 痛苦的是我时候一个.net程序猿,习惯了微软的VS IDE一切都是封装好的.傻瓜式的使用, 不须要关心内部实现. 悲催的是我看到资料都是My Ecl ...
- Service Fabric 用 Powershell 部署应用到本地
前置说明 安装 Service Fabric SDK,会在本机 C:\Program Files\Microsoft SDKs\Service Fabric\Tools\PSModule\Servic ...
- Maven实现Web应用集成測试自己主动化 -- 部署自己主动化(WebTest Maven Plugin)
上篇:Maven实现Web应用集成測试自己主动化 -- 測试自己主动化(WebTest Maven Plugin) 之前介绍了怎样在maven中使用webtest插件实现web的集成測试,这里有个遗留 ...
随机推荐
- 使用Xcode 5创建Cocoa Touch Static Library(静态库)
转自:http://blog.csdn.net/jymn_chen/article/details/21036035 首先科普一下静态库的相关知识: 程序编译一般需经预处理.编译.汇编和链接几个步骤. ...
- 关于shell
操作系统本质上是一个应用程序,他负责硬件资源调度,文件系统管理等最底层的工作. 而shell是系统中一种特别的应用程序.之所以特别,是因为用户一切的操作都是经由shell来实现的. 和我们直接进行交互 ...
- 将ASCII字符串转换为UNICODE字符串
写在前面的话:在MFC的网络编程中,由于现在项目都是使用UNICODE编码,但是网络API的许多函数却只能接受const char*的参数,所以经常会遇到需要将char*转换为TCHAR*的时候,有一 ...
- Maven打包可执行Jar的几种方法
http://m.blog.csdn.net/article/details?id=51871705
- SQLSERVER NULL值判断
sqlserver 在判断数据条件时,如果数据包含null的话则永远为false,null不参与判断,可以使用isnull(列,默认值)来判断null值的数据列,或者列 is null or 列的条件 ...
- FreeRTOS 低功耗之睡眠模式
以下转载自安富莱电子: http://forum.armfly.com/forum.php 低功耗是 MCU 的一项重要的指标,比如某些可穿戴的设备,其携带的电量有限,如果整个电路消耗的电量特别大的话 ...
- docker探索-Win10 Docker 安装使用(一)
本文转自:http://blog.csdn.net/shi1451042748/article/details/52996046 1.前言 Docker最近推出了可以运行在Win10稳定版本,让我们赶 ...
- mysql海量数据处理步骤
本文转自https://segmentfault.com/a/1190000006158186 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据 ...
- VC++中动态链接库的显示加载和隐式加载的区别
两种方法对于你的程序调用动态库时没有任何区别,只是你在编程时,步骤是不一样的.显式调用麻烦了点,但可以没有相应的lib库:隐式调用,使用起来比较 简单,有函数的声明(头文件.h)就可以了,但必须有li ...
- JavaScrip——DOM操作(查找HTML元素/修改元素)
innerHTML 1.查找元素——document.getElementById("intro") 2.输出查找的结果: (1)var a=document.getElement ...