华为云用户手册

  • 步骤二:上传URL列表文件至OBS桶 登录OBS管理控制台,在左侧导航栏选择“桶列表”。 在桶列表中,单击创建的目的端OBS桶,进入“对象”页面。 单击“新建文件夹”,在“文件夹名称”中输入自定义名称(例如:minioUrl),单击“确定”。 单击上一步创建的文件夹名称,进入该文件夹,单击“上传对象”,系统弹出“上传对象”对话框。 通过以下任意方式,将待迁移对象的URL列表文件(在本文示例中为test2.txt)上传至文件夹。 拖拽URL列表文件至“上传对象”区域框内,单击“上传”。 单击“上传对象”区域框内的“添加文件”,选择URL列表文件进行添加,单击“上传”。
  • 准备工作 华为账号准备 使用MgC之前,您需要拥有一个华为账号或一个可用于访问MgC的 IAM 用户,并获取账号/IAM用户的访问密钥(AK/SK)。获取方法请参考准备工作。 创建迁移项目 在MgC控制台为本次迁移创建独立的项目,方法请参考项目管理。 创建目的端OBS桶 在华为云创建一个用于存放URL列表文件和接收源端数据的OBS标准存储桶,区域选择您希望迁移到的目的端区域。创建方法请参考创建桶。 如果使用IAM用户进行迁移,该IAM用户需要拥有目的端桶的读写权限。授权方法请参考对单个IAM用户授予桶的读写权限。 创建集群 通过集群可以创建Master节点、迁移节点和列举节点,确保存储工作流的顺利运行。创建方法请参考创建集群。
  • 更改目的端规格 在资源配置明细区域,单击主机资源操作列的“更改目的端规格”,右侧弹出资源详情窗口。 单击主机规格后的“更改规格”,可以修改目的端主机规格和镜像。 单击磁盘对应的目的端规格处的“更改规格”,可以修改目的端磁盘的存储类型和资源总用量(磁盘容量)。Linux主机的磁盘容量可以根据源端主机磁盘的实际使用量,进行缩容,即小于源端磁盘容量。更改磁盘规格后,系统会自动判断是否进行了磁盘缩容,在主机资源配置明细列表中的“磁盘缩容”列,“是”代表已缩容;“否”代表未缩容。 系统盘容量取值范围为:40 G~1024 G 数据盘容量取值范围为:10 G~32768 G 当前仅支持Linux主机磁盘缩容,需确保缩容后容量大于源端实际使用量。 跨可用区迁移场景仅支持扩容,即使配置缩容,系统也会自动创建一个与源端磁盘容量相同的目的端磁盘。
  • 适用范围 主机来源:适用于阿里云、华为云、AWS、腾讯云、Azure等云厂商的主机,以及自主添加的线下主机。 使用MgC服务进行相关操作,步骤请参考下表。 操作 步骤 Flexus云服务器 X实例评估+手动购买 准备工作+步骤1~7+自行购买。 Flexus云服务器 X实例评估+手动购买+使用MgC工作流迁移上云 准备工作+步骤1~8+自行购买,并在步骤7绑定自行购买的X实例主机。 Flexus云服务器 X实例评估+自动购买+使用MgC工作流迁移上云 准备工作+步骤1~8 。
  • 概述 相对于其他弹性云服务器产品,Flexus云服务器 X实例提供了用户可自定义的精细化产品规格,用来最大化精确匹配用户业务的实际资源需求,以降低用户上云成本,避免资源浪费。为了降低用户选择或自定义X实例规格的复杂度,在迁移场景下,可借助MgC的源端主机性能采集功能,获取源端主机CPU和内存的实际使用情况,再基于性能的评估策略帮助您有效评估并精准调整资源规格配置,实现性能提升与成本控制的双重目标。
  • 准备工作 华为账号准备 使用MgC之前,您需要拥有一个华为账号或一个可用于访问MgC的IAM用户,并获取账号/IAM用户的访问密钥(AK/SK)。获取方法请参考准备工作。 创建迁移项目 在MgC控制台为本次迁移创建独立的项目,方法请参考项目管理。 创建目的端OBS桶 在华为云创建一个用于接收源端数据的OBS桶,区域选择您希望迁移到的目的端区域。创建方法请参考创建桶。 权限配置 确保源端账号和目的端账号拥有迁移需要的权限,详细介绍请参见如何获取源端桶和目的端桶权限?。 创建集群 通过集群可以创建Master节点、迁移节点和列举节点,确保存储工作流的顺利运行。创建方法请参考创建集群。
  • 背景概述 冷存储是一种针对不频繁访问数据的长期备份解决方案,例如,平均一年访问一次的归档存储或平均几年访问一次的深度归档存储。这种存储方式具有高安全性、持久性和成本低等优势。 在迁移冷存储数据时,一个主要的考虑因素是数据访问的延迟。由于数据通常处于"冻结"状态,因此在需要访问时必须先进行数据恢复(即解冻)。解冻方式分为“标准解冻”和“加急解冻”,区别如下: 标准解冻:适用于对访问时间要求不是特别紧急的情况,解冻耗时大约需要3~5小时。 加急解冻:适用于需要快速访问数据的情况,解冻时间可以在1~5分钟内完成,但可能涉及额外的费用。 迁移中心的存储工作流提供了自动“解冻归档数据”功能,采用加急解冻的方式完成数据恢复。
  • 优势 专享迁移集群,减少资源竞争,提高迁移效率。 支持多种云平台对象存储、文件存储服务,支持自建网络文件服务。支持迁移的云平台和存储类型包括: 华为云 OBS 阿里云 OSS 百度云 BOS 腾讯云 COS 金山云 KS3 七牛云 KODO 优刻得 US3 亚马逊 S3 微软云 Blob NAS_GFS NAS_SMB NAS_NFS_V3_MOUNT NAS_NFS_V3_PROTOCOL HTTP/HTTPS数据源
  • 步骤二:创建集群 迁移集群是专为存储工作流提供协作中的核心组件,通过集群可以创建和管理迁移节点、列举节点,部署和升级迁移插件,确保存储工作流顺利运行。详细说明和创建步骤请参见创建集群。 如果是专线迁移场景,需要在高级设置中添加 域名 映射配置,对域名和桶域名同时绑定源端专线内网ip。 例如: 10.0.0.1 obs.cn-north-4.myhuawei.com 10.0.0.1 mySourceBucket. obs.cn-north-4.myhuawei.com 图2 高级设置
  • 过滤策略说明 过滤策略参数填写通配符规则说明和约束说明参见表6。 表6 过滤策略参数说明 参数 说明 填写规则 约束说明 黑名单 命中黑名单规则,则文件不进行迁移/一致性对比。支持精确匹配和模糊匹配。 精确匹配 全路径精确匹配,填写文件绝对路径,特殊字符用反斜杠(\)转义。 注意: 配置黑、白名单注意事项: 如果文件存储服务地址是以冒号加斜杠(:/)结尾,请确保在黑、白名单中填写的路径是相对于挂载地址的绝对路径。 例如,文件存储服务地址为"192.1.1.1:/",挂载地址为"/mnt/turbo",则填写"/mnt/turbo"下的绝对路径。 挂载信息示例: [root@oms-cluster-ecs filter_test]# pwd /mnt/sts_turbo/mgc/filter_test [root@oms-cluster-ecs- filter_test]# ll drwxr-xr-x 2 root root 0 Aug 16 15:27 test2 -rw-r--r-- 1 root root 5 Aug 16 15:27 test2.log 如果要使黑名单精确匹配以避免迁移"test2.log"文件,则应在黑名单中填写路径:/mgc/filter_test/test2.log 如果文件存储服务地址在冒号加斜杠(:/)之后还包含其他路径,配置黑、白名单时,除了填写挂载地址下的绝对路径外,还要加上文件存储服务地址:/之后的部分。 例如,文件存储服务地址为"192.1.1.1:/mgc-test",挂载地址为"/mnt/turbo",则填写"mgc-test+/mnt/turbo"下的绝对路径。 挂载信息示例: [root@oms-cluster-ecs execution-service]# cd /mnt/turbo/autotest/filter_test/ [root@oms-cluster-ecs- filter_test]# ll -rw-r--r-- 1 root root 14 Aug 8 09:22 test1.log drwxr-xr-x 1 root root 4096 Aug 8 09:22 test2 -rw-r--r-- 1 root root 14 Aug 8 09:22 test2.log 如果要使黑名单精确匹配以避免迁移"test2"文件,则应在黑名单中填写路径:/mgc-test/autotest/filter_test/test2 模糊匹配 *匹配任何字符0个或者多个,但不匹配斜杠(/) 使用**匹配任何字符0个或者多个,包括斜杠(/) ?匹配除斜杠(/)之外的任何字符,只能匹配一个 {和}定义元素之间的选择:包含一个以逗号分隔的模式列表, 其中任何一种模式都可能匹配,可以包含通配符。 特殊字符可以在它们之前使用 \进行转义,\后面为通配符时,表示转义,否则表示\本身 除{ 和 } 以外,不能出现连续的规则符号,例如:***、*?、**?、?*、?**、*{*、*}*、*}?、?{*、{*}、{,}、{*,、 ,*}、,*,。 { 和 } 之间的模式,只能使用*做通配符。 { 和 } 之间的模式,不能有{}嵌套。 文件绝对路径在黑名单和白名单同时命中,则黑名单生效,即不做迁移。 需要配置多个匹配规则时,用英文分号隔开。 白名单 白名单为空时,迁移所有文件。 白名单不为空时,仅对绝对路径命中白名单规则的文件进行迁移/一致性对比。 时间段 配置时间段,根据配置,迁移最后修改时间在配置时间段内的文件或者文件夹。 开始时间和结束时间可以配置为空,为空时表示不限制,时间可以精确到分钟。 过滤策略场景规则示例以及举例见下表。 例如第一级目录为“test”,那么: NAS的路径格式为:“/test”。 OBS的路径格式为:“test”。 场景 NAS规则示例 OBS规则示例 说明 文件路径以xx结尾(特定后缀) /xx /**xx xx/**xx xx可以是包含*和?的表达式 根路径下第一层xx开始的文件 /xx* /testssss 匹配 /test/xx 不匹配 /xx* testssss 匹配 test/xx 不匹配 文件路径以xx开始 /xx** /xx/** xx** xx/** 文件名包含xx **xx* **xx* 文件路径包含xx **xx** **xx** 文件路径以xx开始,以yy结尾 /xx**yy xx**yy xx,yy可以是包含*和?的表达式 文件路径以xx,yy结尾(特定后缀) **{xx,yy} **{xx,yy} 文件名包含xx,yy **{xx,yy}* **{xx,yy}* 文件路径包含xx,yy **{xx,yy}** **{xx,yy}**
  • 免责声明 业务可用性风险 本功能旨在帮助用户在迁移后保持主机的私有IP地址与源端一致,但不保证切换IP后的业务可用性。需要用户自行评估并承担由此带来的风险。 回退说明 主机迁移 工作流提供自动化的IP不变功能,但不提供自动化回退功能。如果用户在使用该功能后遇到问题需要回退,仅支持手动回退。 IP冲突风险提示 源端与目的端在私有IP相同的情况下,可能会引发IP冲突,进而导致业务不可用。 未知风险提示 由于迁移无法对业务进行深入的嗅探和分析,因此使用IP不变功能后可能出现其他未被预见的问题。 用户责任 用户应当在迁移前进行充分的测试和准备,并在迁移后自行排查和解决可能出现的问题。我们建议在正式迁移前,用户先在测试环境中进行模拟迁移,以评估潜在风险并制定相应的应对策略。
  • 采集原理 使用MgC采集Azure容器服务AKS资源的原理图,如图1所示。 图1 采集AKS资源原理图 调用SDK:通过Azure提供的SDK,MgC调用AKS API,获取容器、虚拟机等资源信息。 接口返回:MgC接收API调用的返回值,这些返回值通常包含丰富的资源数据。 解析数据:MgC将返回的数据进行解析,提取关键信息,如节点数、虚拟机核数等。然后将这些关键信息保存到数据库中,为后续分析和迁移提供支持。
  • 准备工作 华为账号准备 使用MgC之前,您需要拥有一个华为账号或一个可用于访问MgC的IAM用户, 注册华为账号 以及创建IAM用户的方法请参考准备工作。 创建项目 在MgC控制台为本次采集创建独立的项目(建议创建简单项目),方法请参考项目管理。 Azure认证信息准备 提前获取AKS所在应用客户端的密码、购买AKS的订阅ID,对应应用的租户ID、客户端(应用)ID。这些认证信息的获取方法请参见如何获取添加Azure凭证所需的信息? 添加源端凭证 在MgC控制台添加Azure认证信息作为采集凭证,方法请参考添加凭证。
  • 权限要求 需要确保添加的Azure凭证所属的应用,在购买AKS资源的资源组和订阅里拥有如下权限: Microsoft.ClassicCompute/virtualMachines/read Microsoft.Insights/MetricDefinitions/Read Microsoft.Management/getEntities/action 以上权限的配置方法请参考如何配置采集Azure容器资源所需权限?
  • 准备工作 华为账号准备 使用MgC之前,您需要拥有一个华为账号或一个可用于访问MgC的IAM用户,并获取账号/IAM用户的访问密钥(AK/SK)。获取方法请参考准备工作。 创建迁移项目 在MgC控制台为本次迁移创建独立的项目,方法请参考项目管理。 创建目的端OBS桶 在华为云创建一个用于存放URL列表文件和接收源端数据的OBS标准存储桶,区域选择您希望迁移到的目的端区域。创建方法请参考创建桶。 如果使用IAM用户进行迁移,该IAM用户需要拥有目的端桶的读写权限。授权方法请参考对单个IAM用户授予桶的读写权限。 创建集群 通过集群可以创建Master节点、迁移节点和列举节点,确保存储工作流的顺利运行。创建方法请参考创建集群。
  • 步骤二:上传URL列表文件至OBS桶 登录OBS管理控制台,在左侧导航栏选择“桶列表”。 在桶列表中,单击创建的目的端OBS桶,进入“对象”页面。 单击“新建文件夹”,在“文件夹名称”中输入自定义名称(例如:cephUrl),单击“确定”。 单击上一步创建的文件夹名称,进入该文件夹,单击“上传对象”,系统弹出“上传对象”对话框。 通过以下任意方式,将待迁移对象的URL列表文件(在本文示例中为s3url.txt)上传至文件夹。 拖拽URL列表文件至“上传对象”区域框内,单击“上传”。 单击“上传对象”区域框内的“添加文件”,选择URL列表文件进行添加,单击“上传”。
  • 如何启用 PowerShell 远程管理模块 通常Windows Server 2012及更高版本已默认启用PowerShell远程处理。如果更改了设置,可以通过以下方法重新启用PowerShell远程管理。 以管理员权限启动PowerShell。 执行如下命令,即可启用PowerShell远程管理。 Enable-PSRemoting 验证配置。在PowerShell中输入如下命令: New-PSSession 如果配置成功,则该命令会在本地计算机上创建会话,并返回一个会话对象。返回示例: Id Name ComputerName State ConfigurationName -- ---- ------------ ----- ----- 1 Session1 localhost Opened Microsoft.PowerShell 如果配置失败,请参考 PowerShell 帮助文档中的 about_Remote_Troubleshooting 获取解决方案。 父主题: 常见问题
  • 操作步骤 在执行脚本的主机上创建一个名为“rollback_hosts_win.ps1”的文件,然后将以下脚本示例的内容复制到文件中。 # Configuration # Path to the CS V file with server information. Must exist before running the script. $csvFile = "C:\Users\Public\target_servers.csv" # Manually configure # Directory for storing log files. Will be created if it doesn't exist. $logDir = "C:\Users\Public\Hosts_Script_Logs" # Automatically created # Log file for general run information. $runLog = Join-Path $logDir "run.log" # Automatically created # Log file for error messages. $errorLog = Join-Path $logDir "error.log" # Automatically created # Log file for summary information. $summaryLog = Join-Path $logDir "summary.log" # Automatically created # Initialize log directory and files function Initialize-Logs { if (-not (Test-Path $logDir)) { New-Item -Path $logDir -ItemType Directory } Add-Content -Path $runLog -Value "========================================" Add-Content -Path $runLog -Value "[INFO] $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Starting new restore execution" Add-Content -Path $runLog -Value "========================================" Add-Content -Path $errorLog -Value "========================================" Add-Content -Path $errorLog -Value "[INFO] $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Starting new restore execution" Add-Content -Path $errorLog -Value "========================================" Add-Content -Path $summaryLog -Value "========================================" Add-Content -Path $summaryLog -Value "[INFO] $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Starting new restore execution" Add-Content -Path $summaryLog -Value "========================================" } # Log info function function Log-Info { param ( [string]$message ) $logMessage = "[INFO] $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - $message" Add-Content -Path $runLog -Value $logMessage Write-Output $logMessage } # Log error function function Log-Error { param ( [string]$message ) $logMessage = "[ERROR] $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - $message" Add-Content -Path $runLog -Value $logMessage Add-Content -Path $errorLog -Value $logMessage Write-Output $logMessage } # Read server information from CSV file function Read-ServersFromCSV { param ( [string]$csvFile ) if (-not (Test-Path $csvFile)) { Log-Error "CSV file '$csvFile' not found." exit 1 } return Import-Csv -Path $csvFile } # Add to TrustedHosts function Add-ToTrustedHosts { param ( [string]$ip ) # Check current TrustedHosts list $trustedHostsPath = "WSMan:\localhost\Client\TrustedHosts" $trustedHosts = (Get-Item $trustedHostsPath).Value if ($trustedHosts -eq $null -or $trustedHosts -eq "") { # Set the initial trusted host Set-Item $trustedHostsPath -Value $ip -Force Log-Info "Set initial TrustedHosts value to $ip" } elseif ($trustedHosts -notlike "*$ip*") { # Add new IP to TrustedHosts if not already present $updatedTrustedHosts = if ($trustedHosts -eq "*") { $ip } else { "$trustedHosts,$ip" } try { Set-Item $trustedHostsPath -Value $updatedTrustedHosts -Force Log-Info "Added $ip to TrustedHosts" } catch { Log-Error "Failed to add $ip to TrustedHosts: $_" } } else { Write-Host "TrustedHosts list already contains IP $ip." } } # Initialize log files Initialize-Logs # Verify CSV file if (-not (Test-Path $csvFile)) { Log-Error "CSV file '$csvFile' not found." exit 1 } # Read server information from CSV file $servers = Read-ServersFromCSV -csvFile $csvFile # Counters for success and failure $successCount = 0 $failureCount = 0 $failedServers = @() # Remote script block $remoteScriptBlock = { param () $hostsFilePath = 'C:\Windows\System32\drivers\etc\hosts' # Read the file content $content = Get-Content -Path $hostsFilePath # Initialize flag $inBlock = $false $newContent = @() # Traverse file content foreach ($line in $content) { if ($line -match '#Migration-proxy-start') { $inBlock = $true } if (-not $inBlock) { $newContent += $line } if ($line -match '#Migration-proxy-end') { $inBlock = $false continue } } # Remove trailing empty lines while ($newContent[-1] -eq '') { $newContent = $newContent[0..($newContent.Count - 2)] } # Write the new content back to the file $newContent | Set-Content -Path $hostsFilePath Write-Output 'Successfully restored hosts file on remote server.' } # Main script logic Log-Info "Script execution started." foreach ($server in $servers) { $username = $server.username $ip = $server.ip $password = $server.password if (-not $username -or -not ${ip} -or -not $password) { Log-Error "Invalid server entry: $username, ${ip}, $password. Skipping." continue } Log-Info "Starting restore for $username@${ip}" $securePassword = ConvertTo-SecureString $password -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential ($username, $securePassword) Add-ToTrustedHosts -ip $ip try { $session = New-PSSession -ComputerName ${ip} -Credential $credential -ErrorAction Stop Invoke-Command -Session $session -ScriptBlock $remoteScriptBlock Remove-PSSession -Session $session Log-Info "Restored hosts on ${ip} successfully" $successCount++ } catch { Log-Error "Failed to restore hosts on ${ip}: $_" $failedServers += "$username@${ip}" $failureCount++ } } # Calculate failure and success percentages $totalCount = $servers.Count if ($totalCount -gt 0) { $failurePercentage = [math]::Round(($failureCount / $totalCount) * 100, 2) $successPercentage = [math]::Round(($successCount / $totalCount) * 100, 2) } else { $failurePercentage = 0 $successPercentage = 100 } # Output summary result and log to file $summaryContent = @" ======================================== [SUMMARY] $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Execution Rollback Summary ======================================== Total number of servers: $totalCount Number of successful restores: $successCount Number of failed restores: $failureCount Failure rate: $failurePercentage% Success rate: $successPercentage% ---------------------------------------- "@ if ($failedServers.Count -gt 0) { $summaryContent += "Failed servers:`n" foreach ($server in $failedServers) { $summaryContent += " - $server`n" } } $summaryContent += "========================================" # Output summary result to log file and terminal $summaryContent | Add-Content -Path $summaryLog Write-Output $summaryContent Log-Info "Script execution completed. Check $summaryLog for summary." 根据实际情况,修改脚本中的以下配置项参数: $logDir = "C:\Users\Public\Hosts_Script_Logs" 描述:日志目录路径,用于存放运行日志、错误日志和总结日志的文件夹路径。 参数默认值: C:\Users\Public\Hosts_Script_Logs 修改建议:修改为当前用户具有写入权限的目录路径。 修改示例:$logDir ="C:\Users\username\Documents\Hosts_Script_Logs" $csvFile = "C:\Users\Public\target_servers.csv" 描述:CSV文件存放路径,包含源端主机信息。 参数默认值:C:\Users\Public\target_servers.csv 修改建议:使用绝对路径,或确保相对路径是正确的。如果CSV文件路径发生变化,需要更新填写的路径。 修改示例:$csvFile = "C:\Users\username\Documents\servers.csv" 配置项参数修改完成并保存后,以管理员身份打开PowerShell窗口,使用以下命令执行脚本: .\rollback_hosts_win.ps1 脚本会在终端窗口中输出日志信息,并在执行完毕后生成一个执行结果报告,可以在$logDir 指定目录中的 summary.log 文件中查看。
  • 操作步骤 在执行脚本的主机上创建一个名为“update_hosts_lwin.ps1”的文件,然后将以下脚本示例的内容复制到文件中。 # Configuration # Path to the CSV file with server information. Must exist before running the script. $csvFile = "C:\Users\Public\target_servers.csv" # Manually configure # Path to the hosts content file. Must exist before running the script. $hostsFile = "C:\Users\Public\hosts_content.txt" # Manually configure # Directory for storing log files. Will be created if it doesn't exist. $logDir = "C:\Users\Public\Hosts_Script_Logs" # Automatically created # Log file for general run information. $runLog = Join-Path $logDir "run.log" # Automatically created # Log file for error messages. $errorLog = Join-Path $logDir "error.log" # Automatically created # Log file for summary information. $summaryLog = Join-Path $logDir "summary.log" # Automatically created # Initialize log directory and files function Initialize-Logs { if (-not (Test-Path $logDir)) { New-Item -Path $logDir -ItemType Directory } Add-Content -Path $runLog -Value "========================================" Add-Content -Path $runLog -Value "[INFO] $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Starting new update execution" Add-Content -Path $runLog -Value "========================================" Add-Content -Path $errorLog -Value "========================================" Add-Content -Path $errorLog -Value "[INFO] $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Starting new update execution" Add-Content -Path $errorLog -Value "========================================" Add-Content -Path $summaryLog -Value "========================================" Add-Content -Path $summaryLog -Value "[INFO] $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Starting new update execution" Add-Content -Path $summaryLog -Value "========================================" } # Log info function function Log-Info { param ( [string]$message ) $logMessage = "[INFO] $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - $message" Add-Content -Path $runLog -Value $logMessage Write-Output $logMessage } # Log error function function Log-Error { param ( [string]$message ) $logMessage = "[ERROR] $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - $message" Add-Content -Path $runLog -Value $logMessage Add-Content -Path $errorLog -Value $logMessage Write-Output $logMessage } # Read server information from CSV file function Read-ServersFromCSV { param ( [string]$csvFile ) if (-not (Test-Path $csvFile)) { Log-Error "CSV file '$csvFile' not found." exit 1 } return Import-Csv -Path $csvFile } # Read hosts content from TXT file function Read-HostsContentFromTXT { param ( [string]$hostsFile ) if (-not (Test-Path $hostsFile)) { Log-Error "Hosts content file '$hostsFile' not found." exit 1 } return Get-Content -Path $hostsFile -Raw } # Add to TrustedHosts function Add-ToTrustedHosts { param ( [string]$ip ) # Check current TrustedHosts list $trustedHostsPath = "WSMan:\localhost\Client\TrustedHosts" $trustedHosts = (Get-Item $trustedHostsPath).Value if ($trustedHosts -eq $null -or $trustedHosts -eq "") { # Set the initial trusted host Set-Item $trustedHostsPath -Value $ip -Force Log-Info "Set initial TrustedHosts value to $ip" } elseif ($trustedHosts -notlike "*$ip*") { # Add new IP to TrustedHosts if not already present $updatedTrustedHosts = if ($trustedHosts -eq "*") { $ip } else { "$trustedHosts,$ip" } try { Set-Item $trustedHostsPath -Value $updatedTrustedHosts -Force Log-Info "Added $ip to TrustedHosts" } catch { Log-Error "Failed to add $ip to TrustedHosts: $_" } } else { Write-Host "TrustedHosts list already contains IP $ip." } } # Initialize log files Initialize-Logs # Verify CSV file if (-not (Test-Path $csvFile)) { Log-Error "CSV file '$csvFile' not found." exit 1 } # Verify hosts file if (-not (Test-Path $hostsFile)) { Log-Error "Hosts content file '$hostsFile' not found." exit 1 } # Read server information from CSV file $servers = Read-ServersFromCSV -csvFile $csvFile # Read hosts content from TXT file $hostsContent = Read-HostsContentFromTXT -hostsFile $hostsFile # Counters for success and failure $successCount = 0 $failureCount = 0 $failedServers = @() # Remote script block $remoteScriptBlock = { param ( [string]$hostsContent ) $hostsFilePath = 'C:\Windows\System32\drivers\etc\hosts' # Read the file content $content = Get-Content -Path $hostsFilePath # Initialize flag $inBlock = $false $newContent = @() # Traverse file content foreach ($line in $content) { if ($line -match '#Migration-proxy-start') { $inBlock = $true } if (-not $inBlock) { $newContent += $line } if ($line -match '#Migration-proxy-end') { $inBlock = $false continue } } # Remove trailing empty lines while ($newContent[-1] -eq '') { $newContent = $newContent[0..($newContent.Count - 2)] } # Write the new content back to the file $newContent | Set-Content -Path $hostsFilePath # Append new Migration-proxy section Add-Content -Path $hostsFilePath -Value $hostsContent Write-Output 'Successfully updated hosts file on remote server.' } # Main script logic Log-Info "Script execution started." foreach ($server in $servers) { $username = $server.username $ip = $server.ip $password = $server.password if (-not $username -or -not ${ip} -or -not $password) { Log-Error "Invalid server entry: $username, ${ip}, $password. Skipping." continue } Log-Info "Starting update for $username@${ip}" $securePassword = ConvertTo-SecureString $password -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential ($username, $securePassword) Add-ToTrustedHosts -ip $ip try { $session = New-PSSession -ComputerName ${ip} -Credential $credential -ErrorAction Stop Invoke-Command -Session $session -ScriptBlock $remoteScriptBlock -ArgumentList $hostsContent Remove-PSSession -Session $session Log-Info "Updated hosts on ${ip} successfully" $successCount++ } catch { Log-Error "Failed to update hosts on ${ip}: $_" $failedServers += "$username@${ip}" $failureCount++ } } # Calculate failure and success percentages $totalCount = $servers.Count if ($totalCount -gt 0) { $failurePercentage = [math]::Round(($failureCount / $totalCount) * 100, 2) $successPercentage = [math]::Round(($successCount / $totalCount) * 100, 2) } else { $failurePercentage = 0 $successPercentage = 100 } # Output summary result and log to file $summaryContent = @" ======================================== [SUMMARY] $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Execution Update Summary ======================================== Total number of servers: $totalCount Number of successful updates: $successCount Number of failed updates: $failureCount Success rate: $successPercentage% Failure rate: $failurePercentage% ---------------------------------------- "@ if ($failedServers.Count -gt 0) { $summaryContent += "Failed servers:`n" foreach ($server in $failedServers) { $summaryContent += " - $server`n" } } $summaryContent += "========================================" # Output summary result to log file and terminal $summaryContent | Add-Content -Path $summaryLog Write-Output $summaryContent Log-Info "Script execution completed. Check $summaryLog for summary." 根据实际情况,修改脚本中的以下配置项参数: $logDir = "C:\Users\Public\Hosts_Script_Logs" 描述:日志目录路径,用于存放运行日志、错误日志和总结日志的文件夹路径。 参数默认值: C:\Users\Public\Hosts_Script_Logs 修改建议:修改为当前用户具有写入权限的目录路径。 修改示例:$logDir ="C:\Users\username\Documents\Hosts_Script_Logs" $csvFile = "C:\Users\Public\target_servers.csv" 描述:CSV文件存放路径,包含源端主机信息。 参数默认值:C:\Users\Public\target_servers.csv 修改建议:使用绝对路径,或确保相对路径是正确的。如果CSV文件路径发生变化,需要更新填写的路径。 修改示例:$csvFile = "C:\Users\username\Documents\servers.csv" $hostsFile = "C:\Users\Public\hosts_content.txt" 描述:Hosts文件存放路径,包含要追加到源端主机hosts文件中的内容。 参数默认值:C:\Users\Public\hosts_content.txt 修改建议:使用绝对路径,或确保相对路径是正确的。 修改示例:$hostsFile = "C:\Users\username\Documents\hosts_content.txt" 配置项参数修改完成并保存后,以管理员身份打开PowerShell窗口,使用以下命令执行脚本: .\update_hosts_win.ps1 脚本会在终端窗口中输出日志信息,并在执行完毕后生成一个执行结果报告,可以在$logDir 指定目录中的 summary.log 文件中查看。
  • Hosts文件准备 创建一个文本文件,包含需要追加到源端主机hosts文件中的内容,并确保该文件能被访问。文件内写入相关云服务的接口域名映射,并以#Migration-proxy-start开始,以#Migration-proxy-end结束。相关云服务的接口域名映射需要根据具体的环境而定,请联系对应局点的环境接口人获取。 示例: #Migration-proxy-start xxx.xxx.xxx.xxx iam.xxx.com xxx.xxx.xxx.xxx ecs.xxx.com xxx.xxx.xxx.xxx evs.xxx.com xxx.xxx.xxx.xxx ims.xxx.com xxx.xxx.xxx.xxx obs.xxx.com xxx.xxx.xxx.xxx eps.xxx.com xxx.xxx.xxx.xxx vpc.xxx.com #Migration-proxy-end
  • 检查网络连通性 网络连接检查:确认执行脚本的本地计算机能够通过网络访问所有源端Windows主机的IP地址和端口。源端Windows主机需要对执行脚本的主机开放 5985端口。 防火墙配置:检查并配置本地计算机和源端主机的防火墙,确保允许通过WinRM(Windows远程管理)连接进行远程PowerShell会话。 启用WinRM服务:确保所有源端Windows主机上的WinRM服务已启用并正常运行。可以在源端主机上使用以下命令启用WinRM: Enable-PSRemoting -Force
  • CSV文件准备 创建一个包含源端主机信息的CSV文件,确保文件能被访问,并且格式符合要求。格式如下: username,ip,port,password username:该字段表示登录源端主机时所使用的用户名。为了确保脚本具有足够的权限执行修改操作,通常应使用具有管理员权限的用户名,如Administrator。 ip:该字段表示源端主机的内网IP地址。 port:该字段表示WinRM服务监听的端口号(默认是5985)。 password:该字段表示登录源端主机时所需的密码。脚本将使用此密码通过WinRM协议自动登录到源端主机。 CSV文件的第一行是标题行。 CSV文件的每一行对应一台主机信息,并且每一列信息之间用英文逗号分隔。 确保格式正确和信息准确,不要出现多余的空格、逗号或无效的IP地址等。 示例: username,ip,port,password Administrator,192.168.1.10,xx,examplePass123 Administrator,192.168.1.11,xx,examplePass456
  • 配置PowerShell执行策略 检查执行策略,确保PowerShell允许运行脚本。打开PowerShell,输入以下命令检查当前执行策略: Get-ExecutionPolicy 以下是不同的返回结果说明: Restricted:不允许执行任何脚本。 AllSigned:只能运行由可信发布者签名的脚本。 RemoteSigned:允许运行本地创建的脚本,但远程下载的脚本必须经过签名。 Unrestricted:允许运行所有脚本,但会在运行从互联网下载的脚本时发出警告。 Bypass:不阻止任何脚本的执行,不会显示任何警告或提示。 如果执行策略为Restricted或AllSigned,请通过以下命令临时更改策略,以允许运行本地创建的脚本和已签名的远程脚本。 Set-ExecutionPolicy RemoteSigned -Scope Process 该命令仅在当前PowerShell会话中更改执行策略,并在会话结束后恢复为默认策略。
  • PowerShell 版本和依赖项要求 PowerShell 远程处理依赖于 Windows 远程管理 (WinRM),由 Windows Management Framework (WMF) 提供。 在 PowerShell 上运行远程会话,本地计算机和远程计算机必须满足以下要求: Windows PowerShell 3.0 或更高版本(推荐 WMF 5.1)。 Microsoft .NET Framework 4.0 或更高版本。 Windows 远程管理 3.0 或更高版本。 如果要在 Windows PowerShell 2.0 上运行远程会话,本地计算机和远程计算机必须满足以下要求: Windows PowerShell 2.0 或更高版本。 Microsoft .NET Framework 2.0 或更高版本。 Windows 远程管理 2.0版本。 在 PowerShell 3.0及更高版本上运行的功能(如会话断开和重连),仅在两台计算机都使用 PowerShell 3.0 或以上版本时可用。 使用以下命令可以检查 PowerShell 版本: $PSVersionTable
  • 脚本说明 脚本是基于Powershell语言开发,仅支持在Windows系统上运行,实现对源端待迁移Windows主机的Hosts文件的批量更新和批量恢复。Hosts文件路径C:\Windows\System32\drivers\etc\hosts 脚本执行限制:每次执行脚本时最多支持同时修改100台主机的hosts配置,以避免脚本执行时间过长。 脚本功能与使用场景详细说明参见下表。 脚本名 功能描述 使用场景 update_hosts_win.ps1 批量更新源端Windows主机的hosts文件。脚本会自动记录操作日志,提示异常信息,并生成操作总结。 在迁移Windows主机之前,执行此脚本以更新源端主机的hosts配置。 rollback_hosts_win.ps1 批量恢复源端Windows主机的hosts文件。脚本会自动记录操作日志,提示异常信息,并生成操作总结。 在完成Windows主机迁移后,执行此脚本以恢复源端主机的hosts配置到迁移前的状态。
  • Hosts文件准备 创建一个文本文件,包含需要追加到源端主机/etc/hosts文件中的内容,并确保该文件能被访问。文件内写入相关云服务的接口域名映射,并以#Migration-proxy-start开始,以#Migration-proxy-end结束。相关云服务的接口域名映射需要根据具体的环境而定,请联系对应局点的环境接口人获取。 示例: #Migration-proxy-start xxx.xxx.xxx.xxx iam.xxx.com xxx.xxx.xxx.xxx ecs.xxx.com xxx.xxx.xxx.xxx evs.xxx.com xxx.xxx.xxx.xxx ims.xxx.com xxx.xxx.xxx.xxx obs.xxx.com xxx.xxx.xxx.xxx eps.xxx.com xxx.xxx.xxx.xxx vpc.xxx.com #Migration-proxy-end
  • 执行权限和用户权限配置 用户权限配置:确保执行脚本的用户具有对日志目录、CSV文件和hosts文件的读写权限。 脚本执行权限配置:确保update_hosts_linux.sh 和 rollback_hosts_linux.sh脚本文件具有执行权限。使用chmod +x update_hosts_linux.sh和chmod +x rollback_hosts_linux.sh命令赋予脚本执行权限。
  • CSV文件准备 创建一个包含源端主机信息的CSV文件,确保文件能被访问,并且格式符合要求。格式如下: username,ip,port,password username:该字段表示登录源端主机时所使用的用户名。为了确保脚本具有足够的权限执行修改操作,通常应使用具有管理员权限的用户名,如root。 ip:该字段表示源端主机的内网IP地址。 port:该字段表示SSH服务监听的端口号。默认情况下,Linux系统使用端口22。如果源端主机的SSH服务运行在自定义端口上,请在此处指定正确的端口号。 password:该字段表示登录源端主机时所需的密码。脚本将使用此密码通过SSH协议自动登录到源端主机。 CSV文件的第一行是标题行,不会被脚本解析 CSV文件的每一行对应一台主机信息,并且每一列信息之间用英文逗号分隔。 确保格式正确和信息准确,不要出现多余的空格、逗号或无效的IP地址等。 示例: username,ip,port,password root,192.168.1.10,xx,examplePass123 root,192.168.1.11,xx,examplePass456
  • 脚本说明 脚本是基于Shell语言开发,仅支持在Linux系统上运行,实现对源端待迁移Linux主机的/etc/hosts文件的批量更新和批量恢复。 脚本执行限制:每次执行脚本时最多支持同时修改100台主机的hosts配置,以避免脚本执行时间过长。 脚本功能与使用场景详细说明参见下表。 脚本名 功能描述 使用场景 update_hosts_linux.sh 批量更新源端Linux主机的/etc/hosts文件。脚本会自动记录操作日志,提示异常信息,并生成操作总结。 在迁移Linux主机之前,执行此脚本以更新源端主机的hosts配置。 rollback_hosts_linux.sh 批量恢复源端Linux主机的/etc/hosts文件。脚本会自动记录操作日志,提示异常信息,并生成操作总结。 在完成Linux主机迁移后,执行此脚本以恢复源端主机的hosts配置到迁移前的状态。
  • 操作步骤 建议在源端内网环境中准备一台Windows主机,用于安装迁移工具Edge,对该主机的要求以及Edge的安装方法请参见安装Windows版本的Edge。 不建议将Edge安装在源端待迁移的主机上,主要原因包括: 资源消耗:Edge在采集和迁移运行过程中会消耗CPU和内存资源。在迁移任务量大时,这可能会对源端的业务运行造成影响。 端口占用:Edge会占用源端主机上的一些端口,也可能会对源端业务产生影响。 安装完成并注册用户后,将Edge与迁移中心进行连接,方法请参考连接迁移中心。 连接成功后,需要在Edge上添加源端待迁移主机凭证,凭证的添加方法请参考添加资源凭证。资源类型请根据实际情况选择“Windows主机”或“Linux主机”。
共100000条