基于云的基础架构使IT经理能够为其用户提供来自世界各地数据中心的几乎无限的按需计算和存储资源。成功的容量管理是平衡成本与用户体验方程的关键。运行和预处理的机器可以为用户提供快速连接,但也通过保持云表运行来消耗基础架构成本。
作为基于云的服务,框架始终提供了分析和管理的能力主动能力通过框架管理仪表板使用。
主动能力配置
毫不奇怪,有些客户对更动态的时间表感兴趣,并能够安排生产实例的供应和剥夺以最大程度地减少云存储成本。即使没有使用机器,这些存储成本也会产生。尽管在单个服务器上的成本似乎很低,但是拥有数百或数千台配置机的机器可以迅速加起来。
幸运的是,框架平台还提供了基于REST的平台管理API可以用来使管理员在管理其云基础架构存储成本方面具有更大的灵活性。这些API功能与调度程序结合使用(在我们的示例中,我们将使用内置的Windows Server任务调度程序)为框架管理员提供了最大的灵活性和对帐户弹性设置的控制。此博客向您展示了如何在您自己的帧帐户中的框架实用服务器上设置此功能。
先决条件
对于本教程,我们将运行Frame Utility Server的帧API调用。这不是API工作的要求,但这是快速起床运行的简单方法。如果您的一个框架帐户中还没有帧Windows Utility Server,则可以通过关注我们的指示。AIR 4GB实例类型应该足够。
为了使用框架管理API,您需要从框架租户收集一些值:
客户ID和客户秘密:这些是您的脚本来调用帧管理器API的凭据。可以通过遵循这些生成指示。您分配的角色应为您将动态管理容量的框架帐户上的“帐户管理员”。
选择帐户管理员角色。
帐户ID:帐户ID是您将更新弹性设置的框架帐户的ID。您可以通过进入Nutanix Frame UI并在您计划更改弹性参数的帐户上选择“更新”来找到该值。
单击最右边的kabob后选择“更新”
在浏览器的位置栏中,您会看到类似的东西:
https://frame.nutanix.com/frame/account/1F86E290-8CD2-4950-9C5A-9D3F7ED332E7/basic-info
“帐户”和“基本INFO”之间的信息(在此示例中,1F86E290-8CD2-4950-9C5A-9D3F7ED32E7)是帐户ID。
池ID:您需要的最后一条信息是池ID。获得此值的最简单方法是调用帧管理器API。为此,您必须在实用程序服务器上执行PowerShell命令。为此,请在实用程序服务器上启动会话,然后从PowerShell提示符中运行以下脚本。注意:您将必须将变量设置为您上面收集的值。
#Requires -Version 5
$ clnt_id =“ <客户端ID>”
$ clnt_secret =“ <客户端秘密>”
$ acct_id =“ <帐户ID>”
$ api =“ https://api-gateway-prod.frame.nutanix.com/v1/accounts/”+$ acct_id+“/pools”
$ TIMESTAMP = [MATH] :: FLOOR([DECIMAL](get -date -uformat“%s”))
$ to_sign =“ $($ timestamp)$($ clnt_id)”
$ hmacsha = new-object system.security.cryptography.hmacsha256
$ hmacsha.key = [text.encoding] :: ascii.getbytes($ clnt_secret)
$ signature = $ hmacsha.computehash([text.encoding] :: ascii.getbytes($ to_sign))
$ signature = [System.BitConverter] :: ToString($ signature).replace(' - ','').tolower()
$ headers = @{
'x-frame-clientid'= $ clnt_id
'X框架Timestamp'= $ TIMESTAMP
'X框架签名'= $签名
'content-type'='application/json'
}
[net.ServicePointManager] :: SecurityProtocol = [net.securityprotocoltype] :: TLS12
$ wenspy = invoke -restmethod -method get -uri $ api -headers $ headers
写出$响应
响应应为与该框架帐户相关的生产池的列表,其中条目看起来像:
ID:D2EB96D7-780E-42CB-A4ED-B7BBB7FFA64B3
种类:生产
名称:AIR 8GB
instance_type:n1-standard-2-windows
disk_size:50
external_id:Gateway-Prod.370588
您需要找到要设置容量的生产池(在这种情况下为AIR 8GB)并提取池ID值。这将是您在实际的PowerShell脚本中需要的池ID。
服务器设置
一旦获得了所需的信息,就可以配置框架实用程序服务器动态设置容量。在实用程序服务器上,创建一个目录以保存您的代码(例如,C:\ frameapi \)。在该目录中,放置以下PowerShell脚本。注意:您将需要用上面收集的信息替换变量。
set弹性。ps1
#Requires -Version 5
<#
。笔记
==================================================================
创建于:10/21/2020
组织:Nutanix框架
文件名:setleasticity.ps1
==================================================================
。描述
脚本以设置框架池的max_server设置
客户凭证:
客户ID,客户秘密和帐户ID
pool_id用于合适的池
#>
参数
((
#要将最大服务器设置为的数字。
[参数(强制性= $ true)]
[int]
$ MAXNUM
)
$ clnt_id =“ <客户端ID>”
$ clnt_secret =“ <客户端秘密>”
$ acct_id =“ <帐户ID>”
$ pool_id =“ <池ID>”
函数获取frameapicall {
参数
((
[参数(强制性= $ true)]
[细绳]
$ client_id,
[参数(强制性= $ true)]
[细绳]
$ client_secret,
[参数(强制性= $ true)]
[细绳]
$ API
)
尝试 {
#创建签名
$ TIMESTAMP = [MATH] :: FLOOR([DECIMAL](get -date -uformat“%s”))
$ to_sign =“ $($ timestamp)$($ client_id)”
$ hmacsha = new-object system.security.cryptography.hmacsha256
$ hmacsha.key = [text.encoding] :: ascii.getbytes($ client_secret)
$ signature = $ hmacsha.computehash([text.encoding] :: ascii.getbytes($ to_sign))
$ signature = [System.BitConverter] :: ToString($ signature).replace(' - ','').tolower()
#设置HTTP请求标头
$ headers = @{
'x-frame-clientid'= $ client_id
'X框架Timestamp'= $ TIMESTAMP
'X框架签名'= $签名
'content-type'='application/json'
}
#设置TLS1.2(PS默认使用1.0)并制作HTTP请求
[net.ServicePointManager] :: SecurityProtocol = [net.securityprotocoltype] :: TLS12
$ wenspy = invoke -restmethod -method get -uri $ api -headers $ headers
}
抓住 {
#HTTP 401
if($_。Exception.Response.statuscode-eq“未经授权”){
写入“检查您的客户端和客户端 - 未经授权”
}
#HTTP 404
elseif($_。Exception.Response.statuscode-eq“ notfound”){
写入“检查您的客户端 - 找不到”
}
#HTTP 403
elseif($_。Exception.Response.statuscode-eq“ badrequest”){
写入“检查您的帐户ID -BADREQUEST”
}
# 未处理的异常
别的 {
写入“未知错误:$($ _)。有关更多信息,请联系Nutanix支持”
}
}
返回$响应
}
功能后frameapicall {
参数
((
[参数(强制性= $ true)]
[细绳]
$ client_id,
[参数(强制性= $ true)]
[细绳]
$ client_secret,
[参数(强制性= $ true)]
[pscustomObject]
$ post_data,
[参数(强制性= $ true)]
[细绳]
$ API
)
尝试 {
$ post_data = $ post_data |convert依
#创建签名
$ TIMESTAMP = [MATH] :: FLOOR([DECIMAL](get -date -uformat“%s”))
$ to_sign =“ $($ timestamp)$($ client_id)”
$ hmacsha = new-object system.security.cryptography.hmacsha256
$ hmacsha.key = [text.encoding] :: ascii.getbytes($ client_secret)
$ signature = $ hmacsha.computehash([text.encoding] :: ascii.getbytes($ to_sign))
$ signature = [System.BitConverter] :: ToString($ signature).replace(' - ','').tolower()
#设置HTTP请求标头
$ headers = @{
'x-frame-clientid'= $ client_id
'X框架Timestamp'= $ TIMESTAMP
'X框架签名'= $签名
'content-type'='application/json'
}
#设置TLS1.2(PS默认使用1.0)并制作HTTP请求
[net.ServicePointManager] :: SecurityProtocol = [net.securityprotocoltype] :: TLS12
美元
}
抓住 {
#HTTP 401
if($_。Exception.Response.statuscode-eq“未经授权”){
写入“检查您的客户端和客户端 - 未经授权”
}
#HTTP 404
elseif($_。Exception.Response.statuscode-eq“ notfound”){
写入“检查您的客户端 - 找不到”
}
#HTTP 403
elseif($_。Exception.Response.statuscode-eq“ badrequest”){
写入“检查您的帐户ID -BADREQUEST”
}
# 未处理的异常
别的 {
写入“未知错误:$($ _)。有关更多信息,请联系Nutanix支持”
}
}
返回$ post_response
}
#获取弹性设置
美元
$ res = get -frameapicall -client_id $ clnt_id -client_secret $ clnt_secret -api $ req_string
if($ res.max_servers -ne $ maxnum){
$ currentmax = $ res.max_servers
写出“数字为$ currentmax,应该为$ maxnum”
$ res.max_servers = $ maxnum
$ res1 = post -frameapicall -client_id $ clnt_id -client_secret $ clnt_secret -post_data $ res -api $ req_string
如果($ res1 -ne $ null)
{
写出“用ID创建的任务:” $ res1.id
while($ res1.stage -ne“完成”)
{
写出“等待30秒”
启动睡眠 - 秒30
美元
$ res1 = get -frameapicall -client_id $ clnt_id -client_secret $ clnt_secret -api $ req_string
}
书面输出“持续时间:” $ res1.duration_sec
}
}
别的 {
写出“无事可做”。
}
该脚本设置为将“ max_servers”更改为作为参数传递给脚本的值。该脚本可以通过PowerShell Shell进行交互性运行,以确认脚本正常工作。
通过任务调度程序运行CMD文件更容易,因此在同一目录中创建两个文件(例如C:\ Frameapi)。这些脚本将默认情况下将其输出发送到日志文件,因此,如果创建C:\ frameapi \ log Directory,则可以从这些命令中收集日志。
sethigh.cmd
powerShell -noprofile -ectecutionPolicy旁路-File c:\ frameapi \ setelasticity.ps1 5>%日期:〜7,2% - %日期:〜4,2% - %日期:〜10,4%_%_%_%_%_%_%_%_%_%,2%_%时间:〜3,2%_%时间:〜6,2%.log
setlow.cmd
powerShell -noprofile -ectecutionPolicy旁路-File c:\ frameapi \ setelasticity.ps1 0>%日期:〜7,2% - %日期:〜4,2% - %日期:〜10,4%_%_%_%_%_%_%_%_%_%,2%_%时间:〜3,2%_%时间:〜6,2%.log
在此示例中,sethigh.cmd文件将将所选池的最大容量设置为5,而setlow.cmd将将所选池的最大容量设置为零。“>”将输出重定向到将以当前日期和时间命名的日志文件。您可以定期检查这些文件,以确认CMD的正确执行。
您还可以交互运行CMD文件以确认其操作。最后,您不仅限于两个命令文件,还可以创建尽可能多的命令文件,因为您需要将池中的设置调整为正确的值。
调度
现在,这些作品已经到位,您所要做的就是设置脚本运行时的时间表。要使事物分开,请创建一个名为“ Frameapi”的本地Windows管理员用户,并将其作为本地管理员。现在打开“任务调度程序”,然后选择“创建任务”。
创建任务对话框
给您的任务一个名称,然后“更改用户或组”以使任务使用您创建的Windows用户,然后选择“运行是否登录用户”。
在“触发器”选项卡上,创建一个新的触发器。这将使您在希望运行脚本时安排时间安排。
创建触发对话框
设置时间表,然后单击“确定”。现在,提出“动作”选项卡并创建一个新的动作。
浏览到CMD文件,然后在您创建的日志目录中“启动”它。
创建动作对话框
单击“确定”。您可以在条件和设置选项卡上查看您可能感兴趣的其他选项,但是默认值应起作用。
按“确定”,应该提示您输入“ Frameapi”用户的凭据。输入这些凭据,如果被接受,该任务现在将显示在任务调度程序库中。
现在,您可以按照上述过程添加另一个任务,以通过“ setlow.cmd”重置最大服务器数。
您可以在任务调度程序中检查一下,以查看您的命令是否成功运行,或检查创建的日志文件以确认任务完成。您还可以监视您的结果
“框架分析 - 弹性”图表(在此记录:https://docs.frame.nutanix.com/capacity-management/analytics.html?highlight = analytics/https://docs.frame.nutanix.com/capacity-management/analytics.html?highlight = analytics#elasticity)
弹性图表显示了调整的“最大设置”
这就对了!您现在已经学习了如何使用框架管理API来增加和减少生产池中配置服务器的最大数量以节省存储成本。其他容量设置(最小服务器和缓冲服务器)也是同一API调用的一部分,可以通过对API调用对主脚本进行相对简单的修改来调整。
David Horvath是Nutanix框架的高级解决方案建筑师。他已经成为框架团队的一员已有近4年的历史,在此之前,他花了20年的时间与美国情报界的各种信息技术项目进行咨询。