Apache Airflow 配置管理完全指南:airflow.cfg、环境变量与本地设置
【免费下载链接】airflowApache Airflow - A platform to programmatically author, schedule, and monitor workflows项目地址: https://gitcode.com/GitHub_Trending/ai/airflow
导读
Apache Airflow 的所有运行时行为——从元数据库连接、执行器选择到调度频率——都由一套统一的分层配置体系控制。本文以官方运维文档 set-config.rst 为主体,系统讲解 Airflow 配置的生成方式、airflow config命令行工具、环境变量覆盖机制、_cmd/_secret动态取值后缀以及airflow_local_settings.py本地设置,并结合当前仓库源码(configuration.py、config.yml)深入剖析其底层实现。读完本文,你将掌握一套从开发调试到生产安全部署都适用的配置管理实战方案。
一、配置文件的首次生成与生产实践
第一次运行 Airflow 时,系统会在$AIRFLOW_HOME目录(默认~/airflow)下自动创建一个airflow.cfg文件,包含全部默认配置项。这种开箱即用的方式方便快速上手,但官方明确建议:生产环境不要依赖自动生成的文件,而是通过命令行显式生成配置:
airflow config list --defaults该命令输出的内容包含所有默认配置选项、示例和详尽的注释说明,可以直接复制到配置文件后按需取消注释、修改。这样做有两个核心收益:
- 可以清晰追踪哪些选项被修改过、与默认值的差异在哪里;
- 升级到新版本 Airflow 时,新版本新增或变更的默认值能自动生效,无需手工比对。
直接重定向生成配置文件:
airflow config list --defaults > "${AIRFLOW_HOME}/airflow.cfg"在 Airflow 3.x 中,配置描述(每个 section 的键、默认值、说明)来自 config.yml 这个统一模板,所有核心选项的类型(字符串、布尔、JSON 等)与默认值都定义于此,airflow config list的输出即由此驱动。这意味着配置文件中的注释与默认值始终与当前安装版本严格一致。
二、环境变量覆盖:AIRFLOW__{SECTION}__{KEY}
配置项的另一种设置方式是环境变量,命名格式为AIRFLOW__{SECTION}__{KEY}(注意是双下划线分隔)。例如元数据库连接串在airflow.cfg中写作:
[database] sql_alchemy_conn = my_conn_string对应的环境变量写法为:
export AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=my_conn_string关键规则:section 名中若含点号(.),在环境变量中必须替换为下划线。例如假想的providers.some_providersection:
[providers.some_provider] this_param = true对应环境变量:
export AIRFLOW__PROVIDERS_SOME_PROVIDER__THIS_PARAM=true这一规则之所以存在,是因为环境变量名不允许出现点号,Airflow 在解析环境变量时会用下划线反向匹配带点号的 section,从 configuration.py 的解析逻辑可以印证这一映射关系。
环境变量的最大价值在于:敏感配置(数据库口令、Fernet 密钥等)不需要落盘到明文配置文件,且可以按组件作用域注入,这与官方安全模型(security_model)的建议一致——不同组件只注入其必需的配置,而不是共享全部配置。
三、运行时动态取值:_cmd与_secret后缀
Airflow 支持在配置键后追加_cmd或_secret后缀,实现配置值的运行时动态解析,核心目的是避免把密码以明文形式存放在机器的配置文件中。
3.1_cmd:通过命令获取配置值
[database] sql_alchemy_conn_cmd = bash_command_to_runAirflow 会在运行时执行该命令,并将其标准输出作为配置值。命令本身也可以是环境变量形式:
export AIRFLOW__DATABASE__SQL_ALCHEMY_CONN_CMD=bash_command_to_run3.2_secret:从 Secrets Backend 获取配置值
[database] sql_alchemy_conn_secret = sql_alchemy_conn # 也可以指定嵌套路径 # sql_alchemy_conn_secret = database/sql_alchemy_conn_secret变体会从 Secrets Backend(如 HashiCorp Vault)中拉取配置值,详细机制参见仓库中的 secrets backend 文档。对应环境变量:
export AIRFLOW__DATABASE__SQL_ALCHEMY_CONN_SECRET=sql_alchemy_conn注意:_secret指定的键必须遵循 Secrets Backend 内部的配置前缀命名约定。例如sql_alchemy_conn不是用连接(connection)前缀,而是用配置(config)前缀,在 Vault 中应命名为airflow/config/sql_alchemy_conn。
在 configuration.py 的_get_config_value_from_secret_backend方法中可以看到,Airflow 会通过get_custom_secret_backend()获取已初始化的自定义 Secrets Backend 实例,再按配置键查询值——这正是_secret后缀的底层实现。
3.3 支持_cmd/_secret的配置项清单
以下配置项原生支持_cmd与_secret两种变体:
| Section | 配置键 | 用途 |
|---|---|---|
[database] | sql_alchemy_conn | 元数据库连接串 |
[core] | fernet_key | 加密密钥 |
[celery] | broker_url | Celery broker 地址 |
[celery] | flower_basic_auth | Flower 基础认证 |
[celery] | result_backend | Celery 结果后端 |
[smtp] | smtp_password | SMTP 密码 |
[api] | secret_key | API 签名密钥 |
[api_auth] | jwt_secret | JWT 签名密钥 |
以jwt_secret为例,configuration.py 中可见其默认值由随机生成的_SecretKeys.jwt_secret_key填充,并在启动时回写进配置描述与默认值表——这说明此类密钥尤其适合用_secret方式托管,避免随机默认值在多组件间不一致。
四、配置优先级:统一的解析顺序
Airflow 对所有配置选项采用统一的优先级顺序(从高到低):
- 环境变量(
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN) - 命令环境变量(
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN_CMD) - 密钥环境变量(
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN_SECRET) airflow.cfg中的普通值airflow.cfg中的命令(*_cmd键)airflow.cfg中的密钥(*_secret键)- Airflow 内置默认值
历史版本差异:在 Airflow 2.2.1 至 2.3.0 之间的某些版本中,内置默认值在某些情况下会优先于
airflow.cfg中的命令与密钥键。当前仓库的版本已按上述顺序实现,升级时需留意此行为差异。
理解这一顺序对排障至关重要:当某个配置"改了不生效"时,应首先检查是否存在更高优先级的环境变量覆盖了airflow.cfg中的设置。
五、查看当前配置:config list与config get-value
使用airflow config list可以随时查看当前生效的全部配置:
airflow config list如果只想查看某个选项的值,使用airflow config get-value:
$ airflow config get-value core executor LocalExecutorget-value命令接受<section> <key>两个位置参数,返回的是综合上述优先级后实际生效的值,非常适合脚本化校验配置。从 cli_config.py 可以看到该子命令的注册定义;此外airflow config list的实现位于 provider_command.py 的config_list函数,它会枚举 Providers Manager 中注册的全部 provider 配置项。更完整的配置参考见 configurations-ref.rst。
六、安全部署实践要点
官方文档对生产部署提出了几条硬性要求,务必遵守:
- 按组件限制配置暴露面:不同 Airflow 组件(scheduler、webserver、worker 等)需要的配置参数不同。应只向需要的组件提供敏感参数——如数据库连接串、Fernet 密钥、Secrets Backend 凭据——而不是把全部配置共享给所有组件。某些值必须在特定组件间保持一致,例如 JWT 签名密钥必须在生成与校验令牌的组件之间匹配。
- 环境变量作用域注入:安全敏感场景下,应通过仅对单个组件作用域的环境变量传递配置值(详见 security_model)。
- 时钟同步:运行 Airflow 组件的所有机器必须保持时间同步(例如使用 ntpd),否则访问日志或发起 API 调用时会遇到 "forbidden" 错误。
七、本地设置:airflow_local_settings.py
部分 Airflow 配置无法通过airflow.cfg或环境变量完成,因为它们需要在 Airflow初始化时执行的代码中生效。这类配置通过本地设置文件airflow_local_settings.py完成。
7.1 放置位置
创建airflow_local_settings.py并放入以下任一目录:
sys.path中的任意目录;$AIRFLOW_HOME/config目录——Airflow 初始化时会自动把$AIRFLOW_HOME/config加入sys.path。
重要变更(Airflow 2.10.1 起):
$AIRFLOW_HOME/dags目录在初始化时不再被加入sys.path,因此该目录下的本地设置不会再被导入。请确保airflow_local_settings.py位于初始化时sys.path可达的路径,例如$AIRFLOW_HOME/config。
7.2 参考模板
Airflow 自带一份本地设置示例:airflow_local_settings.py。该文件展示了典型的本地设置写法——例如从conf读取日志相关配置(LOG_LEVEL、LOG_FORMAT、BASE_LOG_FOLDER等)并组装 Python 常量,供后续代码导入使用。
7.3 可通过本地设置配置的功能
通过airflow_local_settings.py可以配置的典型场景包括(完整清单见 set-config.rst 及相关专题文档):
| 功能 | 参考文档 |
|---|---|
| 集群策略(Cluster Policies) | cluster policies |
| 高级日志配置 | write-logs-advanced |
| DAG 序列化 | dag-serialization |
| Kubernetes Executor 的 Pod mutation hook | kubernetes 执行器文档 |
| 控制 DAG 文件解析超时 | faq |
| 自定义 UI | customizing the UI |
| 导出更多动态环境变量 | export dynamic environment variables |
| 自定义数据库配置 | 设置数据库后端 |
八、最佳实践总结
- 开发环境:直接使用首次运行自动生成的
airflow.cfg,快速试错。 - 生产环境:用
airflow config list --defaults生成完整配置模板,仅修改需要的选项并保留注释痕迹。 - 敏感信息:优先使用环境变量、
_secret后缀或 Secrets Backend,避免明文落盘。 - 动态值:需要运行时执行命令获取的值使用
_cmd后缀。 - 排障:牢记统一的优先级顺序(环境变量 > 命令/密钥环境变量 > cfg 普通值 > cfg 命令/密钥 > 内置默认值),用
airflow config get-value验证实际生效值。 - 需要代码参与的配置(集群策略、高级日志、序列化等)放入
$AIRFLOW_HOME/config/airflow_local_settings.py。 - 多组件部署:按组件最小化配置暴露面,保证 JWT 签名密钥等一致性要求,并同步所有节点时钟。
【免费下载链接】airflowApache Airflow - A platform to programmatically author, schedule, and monitor workflows项目地址: https://gitcode.com/GitHub_Trending/ai/airflow
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考