基于Conditions在不同操作系统创建IPv4和IPv6双栈云服务器

更新时间:
复制 MD 格式

本文介绍如何使用 ROS 模板的 Conditions(条件)功能,根据所选操作系统镜像自动执行对应的 IPv6 配置脚本,用同一套模板创建支持 IPv4 和 IPv6 双栈的 ECS 实例。

方案概述

本方案使用 ROS 模板的 Conditions(条件)功能,根据所选的操作系统镜像自动执行不同的 IPv6 配置脚本,创建支持 IPv4 和 IPv6 双栈的 ECS 实例。适用于需要同一套模板同时兼容 Linux(CentOS)和 Windows 系统、并根据操作系统自动切换初始化逻辑的场景。

为什么需要 Conditions

创建绑定 IPv4 和 IPv6 地址的 ECS 实例时,需要额外创建 IPv6 网关、开通公网带宽,并在实例内部配置 IPv6。不同操作系统的配置方式完全不同:

操作系统

IPv6 配置方式

脚本类型

Linux(CentOS)

下载并运行 ecs-utils-ipv6 工具

Bash

Windows

下载并运行 ecs-utils-ipv6.exe 工具

PowerShell

如果不使用 Conditions,需要为每种操作系统各维护一套模板。使用 Conditions 后,一套模板即可兼容两种操作系统。

Conditions 语法结构

Conditions 的使用分为两步:在 Conditions 段落中定义条件,在 Resources 中通过 Fn::If 引用该条件。语法骨架如下。

# 1. 在Conditions段落定义条件
Conditions:
  <条件名>:
    Fn::Equals:              # 或 Fn::And / Fn::Or / Fn::Not
      - <值A>
      - <值B>

# 2. 在Resources中使用Fn::If引用条件
Resources:
  MyResource:
    Properties:
      SomeProperty:
        Fn::If:
          - <条件名>          # 引用Conditions中定义的条件
          - <条件为true时的值>
          - <条件为false时的值>

前提条件

  1. 已拥有阿里云账号,且账号已具备 ROS、ECS、VPC 的操作权限。

  2. 目标地域和可用区支持 IPv6。关于支持IPv6网关的可用区,请参照 IPv6网关支持的地域

操作教程

步骤一:Conditions 条件判断

1.1 定义条件:判断操作系统类型

模板通过 Parameters 定义镜像选择参数,然后使用 Conditions 判断该镜像是否为 CentOS。

Parameters:
  InstanceImageId:
    Type: String
    Default: centos_7
    Description:
      zh-cn: 镜像ID, <br>Linux系统请选择:<font color='red'><b>centos_7</b></font> <br>Windows系统请选择:<font color='red'><b>win2008r2;win2012r2;win2016</b></font>
      en: Image ID,<br>Linux System Select:<font color='red'><b>centos_7</b></font> <br>Windows System Select:<font color='red'><b>win2008r2;win2012r2;win2016</b></font>
    Label:
      zh-cn: 镜像
      en: Image
Conditions:
  CreateLinux:
    Fn::Equals:
      - centos
      - Fn::Select:
          - '0'
          - Fn::Split:
              - _
              - Ref: InstanceImageId

条件 CreateLinux 的判断过程如下:

用户选择镜像参数 InstanceImageId
        │
        │  例如: "centos_7" 或 "win2016"
        │
        ▼
Fn::Split 按"_"拆分
        │
        │  "centos_7" → ["centos", "7"]
        │  "win2016"  → ["win2016"]
        │
        ▼
Fn::Select 取第0个元素
        │
        │  "centos_7" → "centos"
        │  "win2016"  → "win2016"
        │
        ▼
Fn::Equals 与"centos"比较
        │
        ├── 相等 → CreateLinux = true
        │          → 执行Linux Shell脚本配置IPv6
        │
        └── 不等 → CreateLinux = false
                   → 执行Windows PowerShell脚本配置IPv6

1.2 使用条件:Fn::If 分支执行

创建 ECS 初始化 UserData 时,使用 Fn::If 根据操作系统执行不同的初始化脚本:第一个参数是条件名CreateLinux;条件为 true 时使用第二个参数:Linux Shell 脚本,为 false 时使用第三个参数:Windows PowerShell 脚本。两个分支均通过 Fn::Replace 将 ros-notify 替换为 WaitConditionHandle 的信号回传命令,执行完成后向资源栈回传创建结果。

Fn::If:
  - CreateLinux
  - Fn::Replace:
      - ros-notify:
          Fn::GetAtt:
            - WaitConditionHandle
            - CurlCli
      - Fn::Join:
          - ''
          - - '#!/bin/sh'
            - |2
            - |
              cd /opt
            - |
              wget http://ecs-image-utils.oss-cn-hangzhou.aliyuncs.com/ipv6/rhel/ecs-utils-ipv6
            - |
              chmod +x ./ecs-utils-ipv6
            - |
              ./ecs-utils-ipv6
            - |
              ros-notify -d "{\"Data\" : \"SUCCESS\", \"Status\" : \"SUCCESS\"}"
  - Fn::Replace:
      - ros-notify:
          Fn::GetAtt:
            - WaitConditionHandle
            - PowerShellCurlCli
      - Fn::Join:
          - ''
          - - "[powershell]\r\n"
            - "New-Item -Path \"C:\\set_ipv6\" -Force -type directory\r\n"
            - "cd C:\\set_ipv6 \r\n"
            - "$install_dir=\"C:\\set_ipv6\" \r\n"
            - "$install_path = \"$install_dir\\ecs-utils-ipv6.exe\" \r\n"
            - "$tool_url = 'http://ecs-image-utils.oss-cn-hangzhou.aliyuncs.com/ipv6/win/64/ecs-utils-ipv6.exe' \r\n"
            - "Invoke-WebRequest -uri $tool_url -OutFile $install_path \r\n"
            - "Unblock-File $install_path \r\n"
            - "Start-Process -FilePath \"$install_path\" -ArgumentList \"--noenterkey\" -NoNewWindow \r\n"
            - "ros-notify\r\n"

步骤二:创建资源栈

  1. 登录资源编排控制台

  2. 在左侧导航栏,选择模板 > 公共模板

  3. 入门模板页签,通过顶部搜索框按模板名称查找创建绑定IPv4/IPv6双栈的云服务器

  4. 在模板卡片上单击创建资源栈,进入公共模板的资源栈创建流程。

  5. 配置参数页面,输入资源栈名称,并设置以下参数。

    参数

    说明

    示例

    专有网络IPv4网段

    专有网络的IPv4网段。推荐使用以下网段:

    • 10.0.0.0/8

    • 172.16.0.0/12

    • 192.168.0.0/16

    更多信息,请参见专有网络和交换机

    192.168.0.0/16

    交换机IPv4网段

    专有网络下交换机的IPv4网段。

    该网段必须是专有网络 IPv4 网段的子集。

    更多信息,请参见专有网络和交换机

    192.168.0.0/24

    交换机可用区

    专有网络下的交换机可用区ID。

    华北1可用区C

    镜像

    ECS实例的镜像ID。此参数决定 Conditions 的判断结果。

    centos_7

    实例规格

    ECS实例规格。

    ecs.c5.large

    系统盘空间

    ECS实例的系统盘空间。

    取值范围:20~500。

    单位:GB。

    40

    系统盘类型

    ECS实例的系统盘类型。取值:

    • cloud_efficiency:高效云盘。

    • cloud_ssd:SSD云盘。

    • cloud_essd:ESSD云盘。

    • cloud:普通云盘。

    • ephemeral_ssd:本地SSD盘。

    更多信息,请参见云盘概述

    cloud_efficiency

    分配IPv4公网IP

    是否为ECS实例分配IPv4公网地址。

    true

    实例密码

    ECS实例的登录密码。

    Test_12****

    IPv6公网带宽的计费方式

    IPv6公网带宽的计费方式。取值:

    • PayByTraffic:按使用流量

    • PayByBandwidth:按固定带宽

    PayByTraffic

    IPv6网关公网带宽

    IPv6网关的公网带宽。

    取值范围:1~5000。

    单位:Mbps。

    10

    IPv6网关的规格

    IPv6网关的规格。取值:

    • Small:免费版。

    • Medium:企业版。

    • Large:企业增强版。

    Small

  6. 单击创建

步骤三:验证部署结果

3.1 查看资源栈状态和输出

  1. 资源栈信息页签查看资源栈状态。资源栈创建成功后,单击输出,获取EcsInstanceIpv6Address(ECSIPv6地址)。

3.2 验证 IPv6 配置

连接ECS实例,执行以下命令确认 IPv6 地址已配置成功。

Linux 系统:

ifconfig eth0 | grep inet6

Windows 系统:

ipconfig | findstr IPv6

命令输出中应包含以资源栈输出以ECS IPv6地址为前缀的地址信息。

常见问题

Q1:一个模板可以定义多个 Conditions 吗?

可以。Conditions 段落中可以定义多个条件,每个条件有独立的名称和判断逻辑,在 Resources 中通过 Fn::If 引用不同的条件名即可。

Q2:Conditions 支持哪些逻辑函数?

函数

说明

用法

Fn::Equals

判断两个值是否相等。

最常用的条件函数,返回 true 或 false。

Fn::And

逻辑与,所有条件都为 true 时返回 true。

组合多个条件。

Fn::Or

逻辑或,任一条件为 true 时返回 true。

组合多个条件。

Fn::Not

逻辑非,对条件结果取反。

反转条件结果。

Q3:条件判断中可以引用 Mappings 吗?

可以。Conditions 中可以引用 Parameters 的值、Mappings 的查找结果(Fn::FindInMap)以及其他条件的结果,实现复杂的条件逻辑。

想要了解更多资源部署问题,可以查询常见问题合集