全部产品
云市场

使用运维编排创建和更新自定义镜像

更新时间:2019-09-25 10:38:15

背景和痛点

使用自定义镜像的客户,出于安全考虑,应该经常更新镜像,比如,需要定期安装最新的操作系统补丁,升级中间件软件,或者重新安装最新的第三方软件到镜像里。
更新一个已有的镜像通常分为四步:先根据已有镜像创建一台ECS,然后登录这台ECS执行更新软件等操作,接着用更新后的ECS生成新镜像,最后释放掉ECS。如果采用人工操作的方式,费时费力,而且容易出错。

解决方案

运维编排服务OOS,专门为更新镜像的场景提供了更新镜像的公共模版,实现了一键自动化的镜像更新服务。
您只需选择一个源镜像(待更新的镜像),补充更新镜像所需的shell命令(如果是linux实例)等必要参数,然后点击创建执行就可以一键生成新镜像。
使用OOS更新镜像,您无需安装任何额外工具,无需关心ECS的创建,登录,修改,释放等步骤,无需设置环境变量和登录秘钥。
您还可以自定义OOS模板,实现定时或者批量的自动化更新镜像。

操作步骤

  1. 首先登录到运维编排控制台
  2. 单击公共模版
  3. 选择更新ECS镜像,对其单击创建执行oos

  4. 单击 下一步,设置参数oos

  5. 输入以下的参数 。

    • sourceImageId: 您待更新的源镜像ID。
    • instanceType:更新镜像过程中,您允许创建临时ECS实例的规格。
    • securityGroupId:更新镜像过程中,您允许创建临时ECS实例使用的安全组ID。
    • vSwitchId: 更新镜像过程中,您允许创建临时ECS实例使用的交换机ID。
    • commandContent: 更新镜像过程中,您要对临时ECS实例执行的云助手命令,以此达到对镜像的更新。
    • commandType: 请选择您将使用的云助手命令类型,云助手支持以下类型的命令:Linux实例适用的Shell脚本(RunShellScript)、Windows实例适用的Bat脚本(RunBatScript)、Windows实例适用的PowerShell脚本(RunPowerShellScript)。
    • targetImageName: 您打算为新镜像设置的名称。
    • OOSAssumeRole:可选参数。OOS默认使用当前登录用户的权限执行动作;如果指定了RAM角色名称,OOS扮演该RAM角色执行动作。oos
  6. 单击 下一步,确认 ,单击 确认风险并执行oos

  7. 执行管理中可查看刚刚创建的执行,若创建执行成功,且执行状态处于运行中,则表示更新镜像正在进行中。 oos

  8. 当执行状态转换为成功时,则表示镜像更新成功,可在执行详情中查看新镜像ID。 oos

  9. 如需更多了解镜像更新过程,当创建执行成功后,您可单击该执行的详情,查看执行日志,实时了解执行的进度和状态。

附录1:公共模版和背后逻辑

ACS-ECS-UpdateImage公共模板内容如下:

  1. FormatVersion: OOS-2019-06-01
  2. Description: Updates an existing ECS image via ECS Cloud Assistant then creates a
  3. ECS image.
  4. Parameters:
  5. sourceImageId:
  6. Description: The image ID for the ECS instances, centos_6_10_64_20G_alibase_20190326.vhd,
  7. for example.
  8. Type: String
  9. AllowedPattern: '[A-Za-z0-9_\-\.]*'
  10. MinLength: 1
  11. MaxLength: 40
  12. instanceType:
  13. Description: The instance type for the ECS instances, ecs.g5.large, for example.
  14. Type: String
  15. AllowedPattern: ecs\.[A-Za-z0-9\.\-]*
  16. MinLength: 1
  17. MaxLength: 30
  18. securityGroupId:
  19. Description: The security group ID for the ECS instances, sg-xxxxxxxxxxxxxxxxxxxx,
  20. for example.
  21. Type: String
  22. AllowedPattern: sg-[A-Za-z0-9]*
  23. MinLength: 1
  24. MaxLength: 30
  25. vSwitchId:
  26. Description: The virtual switch ID for the ECS instances, vsw-xxxxxxxxxxxxxxxxxxxx,
  27. for example.
  28. Type: String
  29. AllowedPattern: vsw-[A-Za-z0-9]*
  30. MinLength: 1
  31. MaxLength: 30
  32. commandContent:
  33. Description: The content of command.
  34. Type: String
  35. commandType:
  36. Description: The type of command to run in ECS instance.
  37. Type: String
  38. AllowedValues:
  39. - RunBatScript
  40. - RunPowerShellScript
  41. - RunShellScript
  42. MinLength: 1
  43. MaxLength: 30
  44. targetImageName:
  45. Description: The name of image.
  46. Type: String
  47. AllowedPattern: '[A-Za-z0-9\-_]*'
  48. MinLength: 1
  49. MaxLength: 30
  50. OOSAssumeRole:
  51. Description: The RAM role to be assumed by OOS.
  52. Type: String
  53. Default: OOSServiceRole
  54. RamRole: '{{ OOSAssumeRole }}'
  55. Tasks:
  56. - Name: checkNewImageName
  57. Action: ACS::CheckFor
  58. Description: Check image name is available.
  59. Properties:
  60. Service: ECS
  61. API: DescribeImages
  62. Parameters:
  63. ImageName: '{{ targetImageName }}'
  64. DesiredValues:
  65. - 0
  66. PropertySelector: TotalCount
  67. - Name: runInstances
  68. Action: ACS::ECS::RunInstances
  69. Description: Create a ECS instance for the cloud assistant.
  70. Properties:
  71. imageId: '{{ sourceImageId }}'
  72. instanceType: '{{ instanceType }}'
  73. securityGroupId: '{{ securityGroupId }}'
  74. vSwitchId: '{{ vSwitchId }}'
  75. Outputs:
  76. instanceId:
  77. ValueSelector: instanceIds[0]
  78. Type: String
  79. - Name: installCloudAssistant
  80. Action: ACS::ECS::InstallCloudAssistant
  81. Description: Install cloud assostant for ECS instance.
  82. OnError: deleteInstance
  83. Properties:
  84. instanceId: '{{ runInstances.instanceId }}'
  85. - Name: runCommand
  86. Action: ACS::ECS::RunCommand
  87. Description: Run command on ECS instance.
  88. OnError: deleteInstance
  89. Properties:
  90. commandContent: '{{ commandContent }}'
  91. commandType: '{{ commandType }}'
  92. instanceId: '{{ runInstances.instanceId }}'
  93. - Name: stopInstance
  94. Action: ACS::ECS::StopInstance
  95. Description: Stops the ECS instance by the instance ID.
  96. Properties:
  97. instanceId: '{{ runInstances.instanceId }}'
  98. - Name: createImage
  99. Action: ACS::ECS::CreateImage
  100. Description: Create image with the specified image name and instance ID.
  101. OnError: deleteInstance
  102. Properties:
  103. imageName: '{{ targetImageName }}'
  104. instanceId: '{{ runInstances.instanceId }}'
  105. Outputs:
  106. imageId:
  107. ValueSelector: imageId
  108. Type: String
  109. - Name: deleteInstance
  110. Action: ACS::ExecuteAPI
  111. Description: Deletes the ECS instance by the instance ID.
  112. Properties:
  113. Service: ECS
  114. API: DeleteInstance
  115. Risk: Normal
  116. Parameters:
  117. InstanceId: '{{ runInstances.instanceId }}'
  118. Force: true
  119. Outputs:
  120. imageId:
  121. Type: String
  122. Value: '{{ createImage.imageId }}'

该模板顺序执行以下任务:

  1. 检查您打算为新镜像设置的名称是否可用。
  2. 创建并运行一台临时ECS实例。该实例会根据您输入的参数进行创建,即实例将使用的镜像是您待更新的源镜像,实例属性将是您参数中允许的实例属性。
  3. 如果临时ECS实例上没有安装云助手客户端,则进行安装。
  4. 在临时ECS实例上通过云助手执行用来更新的命令,并等待执行成功更新命令成功。
  5. 当临时ECS实例执行更新命令成功后,停止临时ECS实例。
  6. 当临时ECS实例停止后,对该实例创建镜像,并等待镜像创建成功。
  7. 最后,删除临时ECS实例。

附录2:更新镜像的其他方式及对比

以下列出并对比了阿里云当前支持的镜像更新的各种方式,以供参考。

构建方式 工具与依赖 优点 缺点
使用运维编排更新镜像 开通即可,无其他依赖
- 官方推荐,安全可靠
- 在线使用,无需安装
- 官方模板,无需编码
- 无需提供登录秘钥
- 可自定义模版
- 可视化执行过程
- 可批量和定时操作
使用快照创建自定义镜像
使用实例创建自定义镜像
无其他依赖。 ECS控制台操作,简单易用

- 实例和快照需要手动创建
- 操作步骤繁琐,容易出错,效率低
使用Packer构建自定义镜像 需要安装Packer 开源,多云的支持
- 需要安装和维护
- 需要自己编写脚本