我们正在使用的TeamCity CI的构建,我们正试图设置自动部署,以及。
该项目我目前正在部署的Windows服务,根据一个F5负载均衡坐镇。在将来,我们也希望我们的自动化,这也是F5下坐在IIS网站的部署。
从TeamCity的,我们可以执行PowerShell脚本来反安装Windows服务所需的服务器上,把我们的文件给它,然后重新安装服务。
不过,我无法搞清楚如何处理负载均衡。我们将要停用1个节点的时间,注意所有连接砸,然后部署我们的code,并把节点备份。
这似乎将是一个非常普遍的问题,但我发现如何做到这一点令人惊讶的一点信息。
谢谢!
回答
感谢乔纳森·罗西的的iControl PowerShell命令!
有关其他用户的缘故,这里是关停,监测连接砸,推code,然后通过PowerShell脚本上的F5负载均衡义无反顾的样本
有关这些脚本工作,你必须首先从下面
提供的答案中的链接安装F5的iControl的cmdlet #PULL IN OUR F5效用函数
。 \ F5Functions.ps1
#DEFINE逻辑部署code到一个已经被删除从负载平衡器的节点
功能部署(
[F5Node] $节点
)
{
写主机部署到:$ Node.Name
#TODO:远程关闭服务,推送code,启动备份服务
}
#DEFINE NODES
$节点= @()
$节点+ =新对象F5Node -ArgumentList @(TestNode1,1.1.1.1)
$节点+ =新对象F5Node -ArgumentList @(TestNode2,1.1.1.2)
#部署
DeployToNodes -nodes $节点-F5Host $ F5Host -F5UserName $ F5UserName -F5Password $ F5Password
这里是可重复使用的F5Functions脚本
#Load了F5的PowerShell的iControl管理单元
附加PSSnapin iControlSnapin;
写主机进口F5功能!
添加型@
公共类F5Node
{
公共F5Node(字符串名称,字符串地址){
地址=地址;
名称=名称;
}
公共字符串的地址{获取;集;}
公共字符串名称{获取;集;}
公共字符串QualifiedName的{{返回/通用/+姓名;}}
}
@
功能DeployToNodes(
[字符串] $ F5Host = $(抛出缺少所需的参数),
[字符串] $ F5UserName = $(抛出缺少所需的参数),
[字符串] $ F5Password = $(抛出缺少所需的参数),
[F5Node []] $节点= $(抛出缺少所需的参数),
[INT] $ MaxWaitTime = 300 #seconds ...默认为5分钟
){
验证-F5Host $ F5Host -F5UserName $ F5UserName -F5Password $ F5Password
的foreach(在$节点$节点){
DisableNode -Node $节点
WaitForConnectionsToDrop -Node $节点-MaxWaitTime $ MaxWaitTime
#Assume,包括定义的部署方法有一个节点参数此Script
部署-Node $节点
EnableNode -Node $节点
}
}
功能验证(
[字符串] $ F5Host = $(抛出缺少所需的参数),
[字符串] $ F5UserName = $(抛出缺少所需的参数),
[字符串] $ F5Password = $(抛出缺少所需的参数)
)
{
写主机验证到F5 ......
初始化-F5.iControl -HostName $ F5Host -Username $ F5UserName -Password $ F5Password
写主机认证成功!
}
功能ParseStatistic(
[iControl.CommonStatistic []] $ StatsCollection = $(抛出缺少所需的参数),
[字符串] $ STATNAME = $(抛出缺少所需的参数)
)
{
为($ i = 0; $ I $ -lt StatsCollection.Count; $ I ++){
如果($ StatsCollection [$ I] .type.ToString()当量$ STATNAME){
返回$ StatsCollection [$ i] .value.low
打破
}
}
}
功能GetStats(
[F5Node] $节点= $(抛出缺少所需的参数)
)
{
$ ARR = @($ Node.QualifiedName)
$ nodeStats =(GET-F5.iControl).LocalLBNodeAddressV2.get_statistics($ ARR)
返回$ nodeStats.statistics.statistics
#foreach(在$ poolStats.statistics $ memberStats){
#如果($ memberStats.member.address.ToString()当量$节点 - 和$ memberStats.member.port当量$端口){
#返回$ memberStats.statistics
#}
#}
}
功能GetStatistic(
[F5Node] $节点= $(抛出缺少所需的参数),
[字符串] $ STATNAME = $(抛出缺少所需的参数)
)
{
$统计= GetStats -Node $节点
$ STAT = ParseStatistic -StatsCollection $统计-StatName $ STATNAME
返回$统计
}
功能DisableNode(
[F5Node] $节点= $(抛出缺少所需的参数)
)
{
禁用-F5.LTMNodeAddress -Node $ Node.Address
写主机已禁用节点'$节点'
}
功能EnableNode(
[F5Node] $节点= $(抛出缺少所需的参数)
)
{
启用-F5.LTMNodeAddress -Node $ Node.Address
写主机已启用节点$节点'
}
功能WaitForConnectionsToDrop(
[F5Node] $节点= $(抛出缺少所需的参数),
[INT] $ MaxWaitTime = 300
)
{
$连接= GetCurrentConnections -Node $节点
$经过= [System.Diagnostics.Stopwatch] :: StartNew();
而($连接-gt 0 - 和$ elapsed.ElapsedMilliseconds -lt($ MaxWaitTime * 1000)){
启动睡眠-Seconds 10
$连接= GetCurrentConnections -Node $节点
}
}
功能GetCurrentConnections(
[F5Node] $节点= $(抛出缺少所需的参数)
)
{
$连接= GetStatistic -Node $节点-StatNameSTATISTIC_SERVER_SIDE_CURRENT_CONNECTIONS
$名称= $ Node.Name +:+ $ Node.Address
写主机留在'$名字'$连接,连接
返回$连接
}
解决方案
我还没有使用它,但你看了 F5的iControl Web服务API和href="http://www.f5.com/products/technology/microsoft/powershell/"> F5的iControl PowerShell命令通过F5提供的