资讯动态

Apache Airflow 系列教程 | 第3课:Airflow 配置系统深度解析

发布时间:2026/8/25 0:44:57 来源:尧图企业网站定制
导读(Introduction)在前两课中,我们了解了 Airflow 的整体架构并编写了第一个 DAG。但要真正掌握一个系统,你需要理解它的"控制面板"——配置系统。Airflow 的配置系统远比一个简单的配置文件复杂。它是一个多层次、可扩展的配置解析引擎,支持环境变量覆盖、命令动态获取、Secret Backend 集成等高级特性。理解配置系统不仅帮助你正确部署和调优 Airflow,更是排查生产问题时不可或缺的知识。本课将带你深入配置系统的源码实现,从AIRFLOW_HOME的确定到airflow.cfg的解析,从环境变量的优先级规则到 Secret Backend 的链式查找机制。我们还将探讨 Connection 和 Variable 这两个关键的运行时数据管理概念。学习目标(Learning Objectives)完成本课学习后,你将能够:理解配置层级体系——掌握默认值 → config.yml → airflow.cfg → 环境变量 → 命令/Secret 的完整优先级链掌握环境变量覆盖规则——理解AIRFLOW__SECTION__KEY命名约定及其三种变体(直接值、_CMD、_SECRET)阅读配置解析器源码——理解AirflowConfigParser的继承体系和值解析流程理解全局设置初始化——掌握settings.py如何在启动时建立数据库连接、时区和全局变量管理 Connection 和 Variable——理解两者的数据模型、存储机制和安全访问方式理解 Secret Backend 架构——掌握多后端链式查找机制及其扩展方式正文内容(Main Content)1. AIRFLOW_HOME:一切的起点1.1 AIRFLOW_HOME 的确定Airflow 的所有运行时文件都以AIRFLOW_HOME为根目录。从airflow-core/src/airflow/configuration.py第551-553行可以看到:# airflow-core/src/airflow/configuration.pydefget_airflow_home()-str:"""Get path to Airflow Home."""returnexpand_env_var(os.environ.get("AIRFLOW_HOME","~/airflow"))规则简明清晰:如果设置了环境变量AIRFLOW_HOME,使用该值否则默认为~/airflow(当前用户主目录下的 airflow 子目录)expand_env_var()函数会递归展开路径中的~和$VAR引用:defexpand_env_var(env_var:str|None)-str|None:"""Repeat and apply expandvars and expanduser until interpolation stops."""ifnotenv_varornotisinstance(env_var,str):returnenv_varwhileTrue:interpolated=os.path.expanduser(os.path.expandvars(str(env_var)))ifinterpolated==env_var:returninterpolated env_var=interpolated1.2 AIRFLOW_HOME 下的目录结构确定AIRFLOW_HOME后,Airflow 会在其中查找和创建如下结构:$AIRFLOW_HOME/ # 默认 ~/airflow ├── airflow.cfg # 主配置文件 ├── dags/ # DAG 文件目录 ├── logs/ # 任务日志目录 ├── plugins/ # 插件目录 └── simple_auth_manager_passwords.json.generated # 认证信息1.3 配置文件路径的确定配置文件路径通过类似逻辑确定(第556-561行):defget_airflow_config(airflow_home:str)-str:"""Get Path to airflow.cfg path."""airflow_config_var=os.environ.get("AIRFLOW_CONFIG")ifairflow_config_varisNone:returnos.path.join(airflow_home,"airflow.cfg")returnexpand_env_var(airflow_config_var)在模块级别(第795-798行),这两个变量被初始化:# Setting AIRFLOW_HOME and AIRFLOW_CONFIG from environment variables, using# "~/airflow" and "$AIRFLOW_HOME/airflow.cfg" respectively as defaults.AIRFLOW_HOME=get_airflow_home()AIRFLOW_CONFIG=get_airflow_config(AIRFLOW_HOME)2. 配置层级体系:多层次的值解析优先级Airflow 的配置值解析遵循一个明确的优先级链。优先级从高到低:环境变量 AIRFLOW__SECTION__KEY_SECRET(从 Secret Backend 获取) ↓ 若未设置 环境变量 AIRFLOW__SECTION__KEY_CMD(执行命令获取) ↓ 若未设置 环境变量 AIRFLOW__SECTION__KEY(直接值) ↓ 若未设置 airflow.cfg 文件中的 [section] key 配置 ↓ 若未设置 配置命令选项 key_cmd(cfg文件中的命令配置) ↓ 若未设置 Secret 路径选项 key_secret(cfg文件中的secret路径配置) ↓ 若未设置 config.yml 中定义的默认值这个查找链的实现在shared/configuration/src/airflow_shared/configuration/parser.py的_get_env_var_option方法中:# shared/configuration/src/airflow_shared/configuration/parser.py 第1042行def_get_env_var_option(self,section:str,key:str,team_name:str|None=None):"""Get config option from environment variable."""# 方式1: 直接环境变量 AIRFLOW__SECTION__KEYenv_var:str=self._env_var_name(section,key,team_name=team_name)ifenv_varinos.environ:returnexpand_env_var(os.environ[env_var])# 方式2: 命令环境变量 AIRFLOW__SECTION__KEY_CMDenv_var_cmd=env_var+"_CMD"ifenv_var_cmdinos.environ:if(section,key)inself.sensitive_config_values:returnrun_command(os.environ[env_var_cmd])# 方式3: Secret路径环境变量 AIRFLOW__SECTION__KEY_SECRETenv_var_secret_path=env_var+"_SECRET"ifenv_var_secret_pathinos.environ:if(section,key)inself.sensitive_config_values:returnself._get_config_value_from_secret_backend(os.environ[env_var_secret_path])returnNone安全设计:_CMD和_SECRET后缀变体仅对敏感配置项有效(必须在sensitive_config_values集合中注册)。这防止了攻击者通过环境变量注入命令执行非敏感配置项。3. 环境变量覆盖:AIRFLOW__SECTION__KEY 命名约定3.1 基本规则环境变量前缀定义在shared/configuration/src/airflow_shared/configuration/parser.py:ENV_VAR_PREFIX="AIRFLOW__"命名格式为AIRFLOW__{SECTION}__{KEY},注意:双下划线__分隔前缀、Section 和 KeySection 和 Key 均转为大写配置项名中的单下划线保持不变3.2 常见示例配置项对应环境变量[core] executorAIRFLOW__CORE__EXECUTOR[database] sql_alchemy_connAIRFLOW__DATABASE__SQL_ALCHEMY_CONN[core] dags_folderAIRFLOW__CORE__DAGS_FOLDER[scheduler] min_file_process_intervalAIRFLOW__SCHEDULER__MIN_FILE_PROCESS_INTERVAL[api] base_urlAIRFLOW__API__BASE_URL3.3 三种变体的使用场景直接值(适合非敏感配置):exportAIRFLOW__CORE__EXECUTOR=CeleryExecutorexportAIRFLOW__CORE__PARALLELISM=64命令获取(适合敏感配置,值来自命令输出):exportAIRFLOW__DATABASE__SQL_ALCHEMY_CONN_CMD="vault read -field=conn_string secret/airflow/db"Secret Backend 获取(适合与密钥管理系统集成):exportAIRFLOW__DATABASE__SQL_ALCHEMY_CONN_SECRET="secret/data/airflow/db_connection"4. 配置描述文件:config.ymlAirflow 的所有配置项、默认值和描述定义在一个 YAML 文件中。文件路径:airflow-c

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价