条件(Conditions)

每个条件项的最外层函数都需要由Fn::And、Fn::Or、Fn::Not或Fn::Equals定义,在每个条件中都可以引用其他条件、参数值或者映射。您可以在模板的Tasks中,将条件与任务关联起来,条件和任务的关联可以通过Tasks的When字段实现。

语法

每个条件由条件名和条件组成,其中条件名为字符串类型,条件是由下列函数定义。在条件中可以引用其他条件,每个条件名不能重复。

可以在定义条件时使用内置函数(Builtin-Functions),但是最外层函数只能是上述四个函数。

用法示例

  • 引用模板参数

    直接引用模板Parameters已经声明的参数,示例引用了模板已声明的参数buildType

    Conditions:
      NewTemporaryEcs:
        Fn::Equals:
          - '{{ buildType }}'
          - NewTemporaryEcs
  • 引用Task输出

    引用前序任务的输出作为条件判断的一部分,示例引用了任务checkPolicyExist的输出参数existed

    Conditions:
      createStack:
        Fn::Equals:
          - '{{ checkPolicyExist.existed }}'
          - 'false'
    Tasks:
      - Name: checkPolicyExist
        Action:  ACS::CheckFor
        Description:
          en: Check for the inexistence of policy
          zh-cn: 判断自定义权限策略名称存在性
        Properties:
          Service: RAM
          API: GetPolicy
          Parameters:
            PolicyType: 'Custom'
            PolicyName: '{{ policyName }}'
          DesiredValues:
          - 'true'
          - 'false'
          PropertySelector: '.DefaultPolicyVersion != null|tostring'
        Outputs:
          existed:
            Type: String
            ValueSelector: .DefaultPolicyVersion == null|tostring

    注意:条件使用动态参数时,被引用参数的任务必须是条件对应任务的前序任务

  • 多层嵌套函数

    条件中的函数支持多层嵌套,以应对复杂的场景判断

    Conditions:
      downloadWindowsFile:
        Fn::And:
          - Fn::Equals:
              - '{{ queryInstanceOSType.OSType }}'
              - windows
          - Fn::Not:
              Fn::Equals:
                - '{{ artifactsUrl }}'
                - ''

模板示例

  • 关联Conditions和Tasks,本示例中,根据操作系统的值决定执行哪一项任务

    FormatVersion: OOS-2019-06-01
    Description:
      name-en: ACS::ECS::CleanUpDisk
      name-zh-cn: 清理磁盘
      en: Cleanup disk by run command
      zh-cn: 通过执行命令清理磁盘
    # 在Conditions模块设置条件内容
    Conditions:
      Linux:
        Fn::Equals:
            - '{{ queryInstanceOSType.OSType }}'
            - linux
      Windows:
        Fn::Equals:
            - '{{ queryInstanceOSType.OSType }}'
            - windows
    Parameters:
      regionId:
        Description:
          en: The ID of region
          zh-cn: 地域ID
        Type: String
        Default: '{{ ACS::RegionId }}'
      instanceId:
        Description:
          en: The ID of ECS instance
          zh-cn: ECS实例ID
        Type: String
    Tasks:
      - Name: queryInstanceOSType
        Action: 'ACS::ExecuteApi'
        Description:
          en: Queries ECS instance OS type
          zh-cn: 获取实例操作系统类型
        Properties:
          Service: ECS
          API: DescribeInstances
          Parameters:
            RegionId: '{{ regionId }}'
            InstanceIds:
              - '{{ instanceId }}'
        Outputs:
          OSType:
            Type: String
            ValueSelector: 'Instances.Instance[].OSType'
      - Name: cleanupLinuxInstanceDisk
        # 判断操作系统是否为Linux
        When: Linux
        Action: 'ACS::ECS::RunCommand'
        Description:
          en: Runs cleanup disk command on linux instance
          zh-cn: 在linux类型实例上执行清理磁盘命令
        Properties:
          regionId: '{{ regionId }}'
          commandContent: |-
            #!/bin/bash
            cleanUpInfos="{{cleanUpInfos}}"
            # 运行清理磁盘命令
          instanceId: '{{ instanceId }}'
          commandType: RunShellScript
        Outputs:
          result:
            Type: String
            ValueSelector: .invocationOutput
      - Name: cleanupWindowsInstanceDisk
        # 判断操作系统是否为Windows
        When: Windows
        Action: 'ACS::ECS::RunCommand'
        Description:
          en: Runs cleanup disk command on windows instance
          zh-cn: 在windowds类型实例上执行清理磁盘命令
        Properties:
          regionId: '{{ regionId }}'
          commandContent: |-
            #!/bin/bash
            cleanUpInfos="{{cleanUpInfos}}"
            # 运行清理磁盘命令
          instanceId: '{{ instanceId }}'
          commandType: RunPowerShellScript
        Outputs:
          result:
            Type: String
            ValueSelector: .invocationOutput
    Outputs:
      commandOutput:
        Type: String
        Value:
          'Fn::If':
            - 'Fn::Equals':
                - linux
                - '{{ queryInstanceOSType.OSType }}'
            - '{{ cleanupLinuxInstanceDisk.result }}'
            - '{{ cleanupWindowsInstanceDisk.result }}'