YAML 文件中定義和使用變量
在 YAML 文件中定義和使用變量主要依賴于 錨點(diǎn)(Anchors)、別名(Aliases) 和 合并鍵(Merge Keys),但不同工具(如 GitLab CI、Ansible、Kubernetes)會(huì)擴(kuò)展自己的變量語(yǔ)法。以下是通用方法和常見(jiàn)場(chǎng)景的詳解:
一、YAML 原生變量定義(錨點(diǎn)與別名)
YAML 本身不支持動(dòng)態(tài)變量,但可通過(guò) 錨點(diǎn)(&
) 和 別名(*
) 實(shí)現(xiàn)靜態(tài)復(fù)用:
# 定義錨點(diǎn)(類似變量) defaults: &default_settings timeout: 60 retries: 3 # 使用別名引用 job1: <<: *default_settings # 合并內(nèi)容 command: "start" job2: <<: *default_settings command: "stop"
效果等價(jià)于:
job1: timeout: 60 retries: 3 command: "start"
二、工具擴(kuò)展的變量語(yǔ)法
1. GitLab CI/CD 變量
variables: APP_VERSION: "1.0.0" # 定義變量 build: script: - echo "Building $APP_VERSION" # 使用變量 - echo "CI Job ID: $CI_JOB_ID" # 使用預(yù)定義變量
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 # 注入為環(huán)境變量
三、動(dòng)態(tài)變量生成(需工具支持)
1. GitLab CI 通過(guò) dotenv
跨 Job 傳遞
generate_vars: stage: setup script: - echo "DYNAMIC_VAR=generated_value" > vars.env artifacts: reports: dotenv: vars.env # 自動(dòng)加載為變量 use_vars: stage: deploy script: - echo "Using $DYNAMIC_VAR" # 讀取上級(jí)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
五、注意事項(xiàng)
- YAML 類型敏感:
- 特殊字符轉(zhuǎn)義:
- 工具差異: GitLab CI:$VARIABLEAnsible:{{ variable }}Kubernetes:$(ENV_VAR)
六、常見(jiàn)問(wèn)題
Q:如何在 YAML 中實(shí)現(xiàn)跨文件變量共享?
- GitLab CI:使用
include
或extends
- Ansible:通過(guò)
vars_files
Q:變量名中包含連字符(-
)怎么辦?
"special-var": "value" # 用引號(hào)包裹
掌握這些方法后,可以靈活應(yīng)對(duì)不同場(chǎng)景下的 YAML 變量需求!