• Powershell 的自己主动部署


    

    工作中反复性的版本号移植,一天上线10几次,让我痛不欲生,频繁的操作也可能出现疲劳性失误,导致严重的生产故障。于是乎,闲暇时间。我開始研究使用powershell自己主动部署程序到Linuxserver。

    脚本中涉及到下面工具:

    1、Wincp:借助其自身的命令行模式完毕程序部署

    2、powershell的ssh-session模块。通过载入该模块连接到Linuxserver,运行相关shell命令

    3、.net


    開始上代码


    #Public environment configure
    $script:linuxPath="D: est ewpath.txt"
    $script:parentPath="D: est"
    $script:parentPath2=$parentPath -replace "\","/"
    $script:projectConfigureFile="D: estprojectConfigureFile.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:Toolswinscp520WinSCP.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:Toolswinscp520WinSCP.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

    #>

  • 相关阅读:
    WHYZOJ-#53 线段树区间修改(线段树)
    洛谷-3373 【模板】线段树 2 (线段树)
    暑假训练-藏妹子之处(递推)
    POJ-1258 Agri-Net(kruskal最小生成树)
    POJ-2559 Largest Rectangle in a Histogram(单调栈)
    BZOJ3439 Kpm的MC密码
    BZOJ3438 小M的作物
    BZOJ3436 小K的农场
    BZOJ3437 小P的牧场
    BZOJ1430 小猴打架
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6749759.html
Copyright © 2020-2023  润新知