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 变量需求!

传音控股公司福利 360人发布