自动部署到 F5 负载平衡环境

2024-02-11

我们目前正在使用 TeamCity 进行 CI 构建,并且我们也在尝试设置自动化部署。

我当前尝试部署的项目是位于 F5 负载均衡器下的 Windows 服务。将来,我们还希望自动化部署同样位于 F5 下的 IIS 网站。

从 TeamCity 中,我们可以执行 PowerShell 脚本来卸载所需服务器上的 Windows 服务,将文件推送到该服务器,然后重新安装该服务。

但是,我无法弄清楚如何处理负载平衡器。我们希望一次禁用 1 个节点,观察所有连接是否断开,然后部署我们的代码并恢复节点。

这似乎是一个非常常见的问题,但我发现关于如何做到这一点的信息却少得令人惊讶。

Thanks!

Answered

感谢 Jonathon Rossi 提供 iControl Powershell cmdlet!

为了其他用户的利益,这里是关闭、监视连接断开、推送代码,然后通过 powershell 脚本重新打开 F5 负载均衡器的示例

为了使这些脚本正常工作,您首先必须从下面的答案中提供的链接安装 F5 iControl cmdlet

#PULL IN OUR F5 UTILITY FUNCTIONS
. .\F5Functions.ps1


#DEFINE LOGIC TO DEPLOY CODE TO A NODE THAT HAS ALREADY BEEN REMOVED FROM THE LOAD BALANCER
function Deploy(
    [F5Node]$Node
)
{
    Write-Host "Deploying To: "$Node.Name
    #TODO: Remotely shut down services, push code, start back up services
}


#DEFINE NODES
$nodes = @()
$nodes += New-Object F5Node -ArgumentList @("TestNode1", "1.1.1.1")
$nodes += New-Object F5Node -ArgumentList @("TestNode2", "1.1.1.2")

#DEPLOY
DeployToNodes -Nodes $nodes -F5Host $F5Host -F5UserName $F5UserName -F5Password $F5Password

这是可重用的 F5Functions 脚本

#Load the F5 powershell iControl snapin
Add-PSSnapin iControlSnapin;

Write-Host "Imported F5 function!!!"

Add-Type @'
    public class F5Node
    {
        public F5Node(string name, string address){
            Address = address;
            Name = name;
        }
        public string Address {get;set;}
        public string Name {get;set;}
        public string QualifiedName {get{return "/Common/" + Name;}}
    }
'@

function DeployToNodes(
    [string]$F5Host = $(throw "Missing Required Parameter"),
    [string]$F5UserName = $(throw "Missing Required Parameter"),
    [string]$F5Password = $(throw "Missing Required Parameter"),
    [F5Node[]]$Nodes = $(throw "Missing Required Parameter"),    
    [int]$MaxWaitTime = 300 #seconds... defaults to 5 minutes
){
    Authenticate -F5Host $F5Host -F5UserName $F5UserName -F5Password $F5Password

    foreach($node in $Nodes){
        DisableNode -Node $node

        WaitForConnectionsToDrop -Node $node -MaxWaitTime $MaxWaitTime

        #Assume the Script that included this script defined a Deploy Method with a Node param
        Deploy -Node $node    

        EnableNode -Node $node
    }
}

function Authenticate(
    [string]$F5Host = $(throw "Missing Required Parameter"),
    [string]$F5UserName = $(throw "Missing Required Parameter"),
    [string]$F5Password = $(throw "Missing Required Parameter")
)
{
    Write-Host "Authenticating to F5..."
    Initialize-F5.iControl -HostName $F5Host -Username $F5UserName -Password $F5Password
    Write-Host "Authentication Success!!!"
}

function ParseStatistic(
        [iControl.CommonStatistic[]]$StatsCollection = $(throw "Missing Required Parameter"),
        [string]$StatName = $(throw "Missing Required Parameter")
    )
{
    for($i=0; $i -lt $StatsCollection.Count; $i++){   
        if($StatsCollection[$i].type.ToString() -eq $StatName){
            return $StatsCollection[$i].value.low  
            break
        }                      
    }
}

function GetStats(
        [F5Node]$Node = $(throw "Missing Required Parameter")
    )
{
    $arr = @($Node.QualifiedName)
    $nodeStats = (Get-F5.iControl).LocalLBNodeAddressV2.get_statistics($arr)
    return $nodeStats.statistics.statistics

    #foreach($memberStats in $poolStats.statistics){
    #    if($memberStats.member.address.ToString() -eq $Node -and $memberStats.member.port -eq $Port){
    #        return $memberStats.statistics
    #    }  
    #}
}

function GetStatistic(
        [F5Node]$Node = $(throw "Missing Required Parameter"),
        [string]$StatName = $(throw "Missing Required Parameter")
    )
{
    $stats = GetStats -Node $Node
    $stat = ParseStatistic -StatsCollection $stats -StatName $StatName

    return $stat
}

function DisableNode(
    [F5Node]$Node = $(throw "Missing Required Parameter")
)
{    
    Disable-F5.LTMNodeAddress -Node $Node.Address
    Write-Host "Disabled Node '$Node'"
}

function EnableNode(
    [F5Node]$Node = $(throw "Missing Required Parameter")
)
{
    Enable-F5.LTMNodeAddress -Node $Node.Address
    Write-Host "Enabled Node '$Node'"
}

function WaitForConnectionsToDrop(
    [F5Node]$Node = $(throw "Missing Required Parameter"),
    [int]$MaxWaitTime = 300
)
{
    $connections = GetCurrentConnections -Node $Node

    $elapsed = [System.Diagnostics.Stopwatch]::StartNew();
    while($connections -gt 0 -and $elapsed.ElapsedMilliseconds -lt ($MaxWaitTime * 1000)){        

        Start-Sleep -Seconds 10

        $connections = GetCurrentConnections -Node $Node
    }
}

function GetCurrentConnections(
    [F5Node]$Node = $(throw "Missing Required Parameter")
)
{
    $connections = GetStatistic -Node $Node -StatName "STATISTIC_SERVER_SIDE_CURRENT_CONNECTIONS"
    $name = $Node.Name + ":" + $Node.Address
    Write-Host "$connections connections remaining on '$name'"
    return $connections
}

我没用过,不过你看过吗F5 智能控制 https://devcentral.f5.com/icontrolWeb 服务 API 和F5 iControl PowerShell cmdlet http://www.f5.com/products/technology/microsoft/powershell/由F5提供。 PowerShell cmdlet 从那时起就已经存在2007 https://devcentral.f5.com/blogs/us/icontrol-cmdlets#.UcUBfPkwfNE并可以从以下位置下载F5 开发中心 https://devcentral.f5.com/community/group/aft/1172127/asg/3.

看起来有Enable-Member and Disable-Member您将能够使用的 cmdlet。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动部署到 F5 负载平衡环境 的相关文章

  • 为什么要加密 ASP.NET 中的查询字符串?

    我正在开发一个用 C ASP NET 编写的 Web 应用程序 该应用程序的原始设计者选择使用加密的查询字符串和Viewstate控制应用程序的 安全 和 状态 在此之前 我来自 GET POST 世界 我没有很好的基础来理解为什么人们会经
  • 如何在 powershell 中显示带有 .ps1xml 文件的嵌套集合

    我有一个像这样的分层对象结构 public class Department public string Name get set public string Manager get set public Employee Employee
  • C# 要么返回 false 要么什么也不做

    我想知道是否有办法不必重复相同的事情如果施工而是调用一个状态检查 成功后无法返回true 有人知道这个问题更好的标题吗 bool Enable if GetStatus ref status Trace WriteLine Error re
  • FileStream 构造函数和默认缓冲区大小

    我们有一个使用 NET 4 用 C 编写的日志记录类 我想添加一个构造函数参数 该参数可以选择设置文件选项 WriteThrough http msdn microsoft com en us library system io fileo
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • 如何在.NET中使用java.util.zip.Deflater解压缩放气流?

    之后我有一个转储java util zip Deflater 可以确认它是有效的 因为 Java 的Inflater打开它很好 并且需要在 NET中打开它 byte content ReadSample sampleName var inp
  • 如何禁用 Alt + F4 关闭表单?

    What is the best way to disable Alt F4 in a c win form to prevent the user from closing the form 我使用表单作为弹出对话框来显示进度条 但我不希
  • 获得新的 access_token 后,如何更新我的 cookie?

    使用刷新令牌获取新的访问令牌后 我想使用该访问令牌更新我的客户端 cookie 我的客户端能够使用 ajax 登录并调用我的 REST API 但是当第一次授权过期时 API 调用自然不再起作用 我有一个 NET Web 应用程序 它使用自
  • 如果将摘要添加为参考,则摘要不会显示在程序集中

    我用 C 创建了一个 类库 其中包含许多带有摘要的函数 XML 文档注释 例如
  • Jenkins:在管道 Jenkins 文件内执行 AWS CLI 命令

    您知道如何在 aws 中执行 AWS CLI 命令吗 Jenkinsfile为了建立管道 我没有找到任何插件 首先 您需要在服务器上安装 aws cli 并确保 jenkins 用户有权运行它 或者在创建 EC2 实例时简单地使用 Amaz
  • 两个 RichTextBox 具有相同的滚动条

    是否有任何可用的第三方工具有两个富文本框 但两者只有一个共享滚动条 我需要用两种不同的语言实现一些文本 但两个文本框应该同时滚动 public enum ScrollBarType uint SbHorz 0 SbVert 1 SbCtl
  • 在 Azure 上运行 .NET 应用程序

    我拥有在 Amazon EC2 上运行应用程序的丰富经验 它需要一台低端服务器 我目前为该服务器支付大约 90 美元 月 是的 我知道我并不真正需要可扩展性 但我仍然使用 EC2 我想知道将这个纯粹的 NET 应用程序迁移到 Microso
  • 删除匹配前的一个单词和一个单词

    匹配之前的一个单词可以是一组任何符号 例如 D E F 我有一个正则表达式 s w s XXX 输入示例 This is KKK M D D xXx PPP输出示例 This is KKK PPP 所以我需要删除 XXX 之前的 1 个单词
  • ASP.NET Core Identity 更改登录 URL

    我正在使用 ASP NET Core 2 1 并且使用脚手架来添加身份 工作正常 除了当我尝试转到需要登录的页面时 它需要我 Identity Account Login ReturnUrl 如何将其更改为仅转到 Account Login
  • KeyValuePair - 没有无参数构造函数?

    我有一个具有 KeyValuePair 类型属性的对象 我想从数据库读取一些数据并将结果存储在这个 KeyValuePair 类型字段中 myObject KeyValuePairs ctx ExecuteQuery
  • 如何在管道函数中使用 Write-Progress?

    我正在尝试编写一个函数PowerShell接受管道输入 我想使用显示进度条Write Progress 管道中每个项目的增量 例如 function Write PipelineProgress Cmdletbinding Param Pa
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 如何使用 VB.NET 打开受密码保护的共享网络文件夹?

    我需要在网络上打开受密码保护的共享文件夹才能访问 Access 97 数据库 如何打开文件夹并输入密码 在这里找到http www mredkj com vbnet vbnetmapdrive html http www mredkj co

随机推荐

  • @InjectMocks,构造函数或初始化块抛出异常

    当我使用 InjectMocks 出现异常 我的代码如下所示 class A private X x private Y y public A String ip int port this someMethodCall ip port p
  • 公证和装订包含 .app 的 .zip 最有效的方法是什么?

    目前 一个 app 文件夹不能提交公证 必须先打包 另一方面 票证不能钉在 zip公证成功后 苹果文档 https developer apple com documentation xcode notarizing macos softw
  • 使用 boost::spirit 解析为复杂结构

    我有一个用 ABNF 语法规则编码的输入 它是 MEGACO 协议 3 15 232 33 21 2134 T 173619123 C 230234621 PR 9 MF ip 187 6 23045241 MF ip 187 6 2304
  • 这段使用 [].filter.call 的代码做了什么?

    我正在学习 javascript 并尝试编写对列表进行排序的代码 如果元素满足某些条件则将其删除 我发现这个片段看起来很有希望 但不知道它是如何工作的 所以我可以根据我的需要调整它 list document getElementById
  • 为什么 CSS 中的背景图像比内联背景颜色具有更高的优先级?

    我试图用内联背景颜色覆盖 CSS 中预定义的背景图像 认为它实际上会覆盖 但看起来并没有 我怎样才能实现这个目标 section position relative top 0 left 0 width 250px height 250px
  • 计算 Javascript 中的小时差,但仅限特定时间

    不确定描述这一点的最佳方式 但我需要计算时间差异 向下舍入 但仅限于晚上 8 点到早上 6 点之间 或者在本例中为 20 00 06 00 例如 22 00 04 00 6 hours 02 40 10 20 4 hours 20 00 0
  • 如何将数组输入用于自定义 GitHub Actions

    我正在开发 GitHub Actionworkflow https github com MathieuSoysal Javadoc publisher yml blob 4ea2062374784e3de840530c99365039f5
  • OpenCV calibrateCamera() 断言失败

    我已经尝试使用 Opencv calibrateCamera 函数校准我的相机有一段时间了 我遵循了 opencv 示例程序中描述的相同过程 我尝试首先加载 10 个 9 x 6 棋盘图像 然后找到棋盘角 如果找到角点 则角点的像素位置将存
  • 如何在 JavaScript 中添加新元素?

    我创建了一个 JavaScript 脚本 可以将其粘贴到某人的页面上以创建 iFrame 我希望人们能够将脚本粘贴到他们希望 iFrame 出现的位置 但是 我不知道如何将 DOM 创建的 iFrame 附加到粘贴脚本的位置 它总是将其附加
  • 为 html 元素添加点击处理程序?

    我有一个使用 html 预先生成的页面 它看起来像一个可滚动的 div 列表 类似于 div div Item A div div div div Item B div div 我想在我的入口点方法中获取它们 并为每个添加一个单击处理程序
  • 在 Windows 上正确设置 DJANGO_SETTINGS_MODULE

    我有关于这个查询的帖子 但大多数都是针对 Linux 的 没有一个明确适用于 Windows 在我的应用程序中 我正在设置数据库 sqlite3 Django 中的默认值 编辑我的应用程序 mysite 的setting py文件后 DAT
  • 类在目标中被链接多次

    我有两个目标app and appTests 我也有课Wine和框架Realm和 RealmSwift 它们链接到这两个目标 当我使用类时也不例外Wine在目标中app 但是当我想运行测试时 appTests swift 22行 impor
  • 如何销毁由 resque 工作人员排队的工作?

    我在 Rails 3 项目上使用 Resque 来处理计划每 5 分钟运行一次的作业 我最近做了一些事情 使这些工作岗位的创造如滚雪球般增长 目前该堆栈已达到 1000 多个工作岗位 我修复了导致许多作业排队的问题 现在我遇到的问题是由错误
  • ReferenceError:ReactJS Build 中未定义 localStorage

    我在 React 应用程序中的经过身份验证的组件上大量使用 localStorage 以从本地存储获取用户详细信息并在登录时存储它们 当我构建我的应用程序时 它会抛出ReferenceError localStorage is not de
  • RxJava API 和 Java 9 Flow API 之间的区别

    在过去几个主要版本的 Java 的每次迭代中 似乎都有一致的新方法来管理并发任务 在 Java 9 中 我们有Flow API https docs oracle com javase 9 docs api index html java
  • R dplyr mutate_at 访问 colnames

    如何访问正在处理的列名dplyr mutate at 假设我们想要将数据框的列转换为因子 其级别存储在单独的列表中 df lt data frame C1 c A B C C2 c D E F df C1 C2 1 A D 2 B E 3
  • suffix(from:) 和 dropFirst(_:) 之间有什么区别吗?

    我突然想到 在 Swift 中处理子序列时 func suffix from Int 似乎与刚才相同dropFirst 显然 对于长度为 10 的数组 只需将输入值从 3 更改为 7 即可 只是重复一遍 所以 当然 对于一系列的说法长十 我
  • Python 中 switch/case 的语法等价物是什么? [复制]

    这个问题在这里已经有答案了 Programming languages like C C C Java JavaScript and Pascal Reference https en wikipedia org wiki Switch s
  • 删除 Github 上使用 提交的

    我在 github 上有一些提交 如下所示 有没有一种方法可以重新设置基准 以便我可以摆脱这个问题并简单地将提交标记为由我标记 首先我会检查你的 git 是否配置了正确的用户信息 跑步git config list以验证一切是否正确 您还可
  • 自动部署到 F5 负载平衡环境

    我们目前正在使用 TeamCity 进行 CI 构建 并且我们也在尝试设置自动化部署 我当前尝试部署的项目是位于 F5 负载均衡器下的 Windows 服务 将来 我们还希望自动化部署同样位于 F5 下的 IIS 网站 从 TeamCity