
# IaC Spec包典型目录结构
IaC Spec包用于描述环境。
#### 目录结构介绍
表1IaC Spec包结构说明 
| 位置                                  | 类型  | 个数  | 描述                                                                                                 |
|:---|:---|:---|:---|
| iacspec_{service}_{version}.zip     | 文件  | 1   | IaC压缩包。                                                                                            |
| └── package.json                    | 文件  | 1   | 包描述文件，相关说明请参见[包描述文件介绍](https://support.huaweicloud.com/devg-appstage/appstage_06_0085.html)。       |
| └── global/                         | 文件夹 | 1   | 全局默认的IaC描述，包含完整文件结构，放置被所有规格目录所复用的配置文件。                                                             |
| │ └── meta.yaml                     | 文件  | 1   | 变更策略描述，相关说明请参见[在IaC代码中定义流水线](https://support.huaweicloud.com/devg-appstage/appstage_06_0075.html)。 |
| │ └── environment/                  | 文件夹 | 1   | 定义component1，公共资源。                                                                                 |
| │ └── resources.yaml                | 文件  | 1   | 公共资源列表，相关说明请参见[在IaC代码中声明资源](https://support.huaweicloud.com/devg-appstage/appstage_06_0035.html)。  |
| │ └── values.yaml                   | 文件  | 1   | 公共资源参数值，在resources.yaml中通过$ref的方式来引用。                                                              |
| │ └── {microservice}/               | 文件夹 | 0-N | 定义component2，微服务资源。                                                                                |
| │ └── resources.yaml                | 文件  | 1   | 微服务资源列表，相关说明请参见[在IaC代码中声明资源](https://support.huaweicloud.com/devg-appstage/appstage_06_0035.html)。 |
| │ └── values.yaml                   | 文件  | 1   | 微服务资源参数值，在resources.yaml中通过$ref的方式来引用。                                                             |
| │ └── configs/                      | 文件夹 | 1   | 微服务配置目录。                                                                                           |
| │ └── config_schema.yaml            | 文件  | 1   | 声明微服务的业务配置项属性，敏感业务配置项需要声明，非敏感配置项可以不声明。在resources.yaml中通过$ref的方式来引用。                                |
| │ └── {cluster}_config_records.yaml | 文件  | 0-N | 微服务的业务配置项，在resources.yaml中通过$ref的方式来引用。                                                            |
| └── specs/                          | 文件夹 | 1   | 环境特定的IaC描述，结构与global相同，但仅包含与global有差异的文件。                                                          |
| │ └── cn_product_cbu/               | 文件夹 | 1   | 中国区生产环境，命名采用站点级Cloud Map的名称，可以在环境管理界面查看可选的站点级Cloud Map名称列表。                                        |
| │ └── environment/                  | 文件夹 | 0-1 | 环境公共资源。                                                                                            |
| │ └── values.yaml                   | 文件  | 0-1 | 公共资源参数值。                                                                                           |
| │ └── {microservice}/               | 文件夹 | 0-N | 微服务资源。                                                                                             |
| │ └── values.yaml                   | 文件  | 0-1 | 微服务资源参数值。                                                                                          |
| │ └── configs/                      | 文件夹 | 0-1 | 微服务配置目录。                                                                                           |
| │ └── {cluster}_config_records.yaml | 文件  | 0-N | 微服务的业务配置项。                                                                                         |
| │ └── aaa_product_cbu/              | 文件夹 | 1   | 亚非拉生产环境。                                                                                           |
| │ └── eu_product_cbu/               | 文件夹 | 1   | 欧洲生产环境。                                                                                            |
   
#### global与specs的协同关系
- global文件夹：放置被所有规格目录所复用的配置文件。 global文件夹里面的微服务都可以被规格文件夹specs中的代码复用（可根据meta.yaml指定复用哪些微服务，取决于在相应环境的部署规划）。
  global文件夹的作用类似于Java中的父类，specs类似于继承了global的子类，实际部署时还是使用的specs中的文件，但specs中的文件可以继承和复用global文件。
  - meta.yaml：描述变更的组件与过程。
  
  - {microservice}：描述要变更的微服务。
    - resources.yaml：微服务变更的主体文件，其他所有的values.yaml、config文件夹中的yaml等文件都围绕此文件展开。文件名必须为resources.yaml。
    
    - 其他文件：为变量配置文件，其定义的内容都会被resources.yaml引用，文件名称可自定义。
     
   
- specs文件夹：同一个服务在不同用途环境下所需配置文件（基础设施）。这个文件目录是必须的。 specs是在环境上部署服务时，最终使用的配置文件，当部署服务时，第一关注点和入口就是specs。
  specs目录下的规格文件夹，命名采用站点级Cloud Map的名称（cn_product_cbu、eu_product_cbu）。可以在环境管理界面查看可选的站点级Cloud Map名称列表。
  当某个规格被选用于部署时，会先将该规格目录下所有文件与global目录进行合并，得到该规格目录最终的所有配置文件，再进行部署动作。
  
 
合并策略：如果文件的相对路径相同，则规格目录下的文件保留，global目录下的文件被覆盖，其他文件则共存。
global目录应包含完整的YAML内容，即：其下meta.yaml通过$ref引用的YAML内容都存在于global目录中。这样能确保即使规格目录为空，也能引用到global目录的默认参数，从而完成部署。
此处WiseChaos的IaC代码为例，详细描述代码运行原理及涉及的各个IaC文件的作用，微服务WiseChaos的整体IaC代码结构如下：
```
iac3.0                                       # IaC3.0代码根目录：目录名字可自定义
└─ WiseEyeChaosMonkeyService               # 此级目录为服务级目录，名字与所部署的服务名称相同
    ├─ global                              # global目录：放置所有规格目录所复用的配置文件
 ├─ WiseEyeChaosIssueMgrService
 ├─ WiseEyeChaosManageService
 ├─ WiseEyeChaosMonkeyExecutor
 │  └─ config
 │        ├─ business_config.yaml
 │        ├─ env.yaml
 │        ├─ envs_dynamic.yaml
 │        ├─ hosts.yaml
 │        └─ sidecar_aiops_param.json
           └─ resources.yaml
 │  └─ values.yaml
 ├─ WiseEyeChaosMonkeyPortal
        │  └─ config
        │        └─ sidecar_aiops_param.json
        │  └─ resources.yaml
        │  └─ values.yaml
 └─ WiseEyeChaosPortal
        └─meta.yaml
    ├─specs              # 规格文件，描述了每个规格的定制化需求，最终部署的时候以specs文件为准
        ├─cn_product_cbu
            ├─WiseEyeChaosMonkeyExecutor
     │  └─config
     │        ├─ envs_dynamic.yaml
     │        ├─ hosts.yaml
     │        └─ sidecar_aiops_param.json
     │  └─values.yaml
     ├─WiseEyeChaosMonkeyPortal
            │  └─config
            │        └─ sidecar_aiops_param.json
            │  └─values.yaml
            └─ meta.yaml
        ├─aaa_product_cbu
        └─eu_product_cbu
   └─package.json
```
当对此微服务的IaC代码打包合并时：
- specs中存在而global中不存在的文件，使用specs中的文件。
- specs中不存在而global中存在的文件，使用global中的文件。
- specs和global中都存在的，则使用specs中的文件。
以/iac3.0/WiseEyeChaosMonkeyService/specs/cn_product_cbu为例，在specs中的cn_product_cbu目录和global中都有WiseEyeChaosMonkeyExecutor和WiseEyeChaosMonkeyPortal微服务文件夹。
合并后最终呈现的文件目录如下：
"覆盖"指的是完全取代，不是内容合并。
```
cn_product_cbu
  ├─ meta.yaml                          # 来自于specs目录，覆盖global中的文件
  ├─ WiseEyeChaosMonkeyExecutor
  │  ├─ values.yaml                    # 来自于specs目录，覆盖global中的文件
  │  ├─ resources.yaml                 # 来自于global中的文件
  │  └─ config
  │        ├─ business_config.yaml     # 来自于global中的文件，因为specs中不存在
  │        ├─ env.yaml                 # 来自于global中的文件，因为specs中不存在
  │        ├─ envs_dynamic.yaml        # 来自于specs目录，覆盖global中的文件
  │        ├─ hosts.yaml               # 来自于specs目录，覆盖global中的文件
  │        └─ sidecar_aiops_param.json # 来自于specs目录，覆盖global中的文件
  ├─ WiseEyeChaosMonkeyPortal
  │  ├─ values.yaml                    # 来自于specs目录，覆盖global中的文件
  │  ├─ resources.yaml                 # 来自于global中的文件，因为specs中不存在
  │  └─ config
  │        └─ sidecar_aiops_param.json # 来自于specs目录，覆盖global中的文件
  ├─ WiseEyeChaosIssueMgrService        # 来自于global中的文件，因为specs中不存在
  ├─ WiseEyeChaosManageService          # 来自于global中的文件，因为specs中不存在
  └─ WiseEyeChaosPortal                 # 来自于global中的文件，因为specs中不存在
```
