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
五、注意事项
- YAML 类型敏感:
- 特殊字符转义:
- 工具差异: GitLab CI:$VARIABLEAnsible:{{ variable }}Kubernetes:$(ENV_VAR)
六、常见问题
Q:如何在 YAML 中实现跨文件变量共享?
- GitLab CI:使用
include
或extends
- Ansible:通过
vars_files
Q:变量名中包含连字符(-
)怎么办?
"special-var": "value" # 用引号包裹
掌握这些方法后,可以灵活应对不同场景下的 YAML 变量需求!