Fluentd 配置文件里能使用环境变量吗?
可以——Fluentd 配置中用 "#{ENV['VAR_NAME']}" 内嵌 Ruby 表达式引用环境变量。本文给出语法示例、常见用途(密钥、地址、环境区分)与容器部署中的配合方式。
可以。Fluentd 配置文件支持 "#{ENV['变量名']}" 语法内嵌环境变量——配置在加载时会执行这段 Ruby 表达式,把变量值替换进去。
基本语法
<match app.**>
@type elasticsearch
host "#{ENV['ES_HOST']}"
port "#{ENV['ES_PORT']}"
user "#{ENV['ES_USER']}"
password "#{ENV['ES_PASSWORD']}"
</match>
启动前确保变量已 export:
export ES_HOST=elasticsearch.internal ES_PORT=9200
fluentd -c fluent.conf
典型用途
- 密钥外置:密码、Token 不进配置文件,可安全提交 Git;
- 环境区分:同一套配置在 dev/staging/prod 用不同变量值;
- 容器化部署:Docker/K8s 中通过 env 注入,镜像一处构建多处运行。
注意事项
- 变量未设置时替换结果是空字符串,不会报错——启动后用
fluentd --dry-run或检查输出连接确认; - K8s 中配合 Secret 注入:
valueFrom: {secretKeyRef: {...}}; - 想要默认值可以用 Ruby 写法:
"#{ENV['ES_PORT'] || '9200'}"。
观测云对照
观测云 DataKit 支持在配置中引用环境变量(ENV 函数),K8s 部署时 Token、工作空间地址等敏感项全部通过环境变量注入,配置模板可安全入库。
常见问题(FAQ)
Q:Systemd 部署怎么传变量? 在 unit 文件用 Environment= 或 EnvironmentFile= 声明。
Q:支持默认值吗? 用 Ruby 的 || 表达式即可实现。