YAML 文件中定义和使用变量

在 YAML 文件中定义和使用变量主要依赖于 锚点(Anchors)别名(Aliases)合并键(Merge Keys),但不同工具(如 GitLab CI、Ansible、Kubernetes)会扩展自己的变量语法。以下是通用方法和常见场景的详解:

一、YAML 原生变量定义(锚点与别名)

YAML 本身不支持动态变量,但可通过 锚点(&别名(* 实现静态复用:

# 定义锚点(类似变量)
defaults: &default_settings
  timeout: 60
  retries: 3

# 使用别名引用
job1:
  <<: *default_settings  # 合并内容
  command: "start"

job2:
  <<: *default_settings
  command: "stop"

效果等价于

job1:
  timeout: 60
  retries: 3
  command: "start"

二、工具扩展的变量语法

1. GitLab CI/CD 变量

variables:
  APP_VERSION: "1.0.0"  # 定义变量

build:
  script:
    - echo "Building $APP_VERSION"  # 使用变量
    - echo "CI Job ID: $CI_JOB_ID"  # 使用预定义变量

2. Ansible Playbook 变量

vars:
  http_port: 80  # 定义变量

tasks:
  - name: Ensure Apache is running
    ansible.builtin.service:
      name: httpd
      state: started
    when: http_port == 80  # 使用变量

3. Kubernetes ConfigMap/Env

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  LOG_LEVEL: "DEBUG"  # 定义配置

---
apiVersion: apps/v1
kind: Deployment
spec:
  containers:
    - name: app
      envFrom:
        - configMapRef:
            name: app-config  # 注入为环境变量

三、动态变量生成(需工具支持)

1. GitLab CI 通过 dotenv 跨 Job 传递

generate_vars:
  stage: setup
  script:
    - echo "DYNAMIC_VAR=generated_value" > vars.env
  artifacts:
    reports:
      dotenv: vars.env  # 自动加载为变量

use_vars:
  stage: deploy
  script:
    - echo "Using $DYNAMIC_VAR"  # 读取上级Job生成的变量

2. Helm Charts 模板变量

# values.yaml
replicaCount: 3

---
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
spec:
  replicas: {{ .Values.replicaCount }}  # 模板变量渲染

四、变量使用技巧

1. 多行变量

variables:
  MULTILINE_SCRIPT: |
    echo "Line 1"
    echo "Line 2"
    
script:
  - eval "$MULTILINE_SCRIPT"

2. 条件变量(GitLab CI Rule)

variables:
  DEPLOY_ENV: $CI_COMMIT_BRANCH == "main" ? "prod" : "staging"

3. 嵌套变量

variables:
  BASE_DIR: "/app"
  LOG_PATH: "$BASE_DIR/logs"  # → /app/logs

五、注意事项

  1. YAML 类型敏感
  2. 特殊字符转义
  3. 工具差异: GitLab CI:$VARIABLEAnsible:{{ variable }}Kubernetes:$(ENV_VAR)

六、常见问题

Q:如何在 YAML 中实现跨文件变量共享?

  • GitLab CI:使用 includeextends
  • Ansible:通过 vars_files

Q:变量名中包含连字符(-)怎么办?

"special-var": "value"  # 用引号包裹

掌握这些方法后,可以灵活应对不同场景下的 YAML 变量需求!

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务