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 不进配置文件,但环境变量仍可能通过进程、调试输出等暴露,需控制访问与日志;
- 环境区分:同一套配置在 dev/staging/prod 用不同变量值;
- 容器化部署:Docker/K8s 中通过 env 注入,镜像一处构建多处运行。
注意事项
- 变量未设置时 ENV[] 返回 nil,插值通常得到空字符串;插件可能因此校验失败。必填变量可用
"#{ENV.fetch('ES_HOST')}"让缺失值直接报错。启动前用fluentd --dry-run -c fluent.conf检查配置,实际投递还需另行验证; - K8s 中配合 Secret 注入:
valueFrom: {secretKeyRef: {...}}; - 想要缺失时的默认值可以用 Ruby 写法(空字符串不会触发 || 默认值):
"#{ENV['ES_PORT'] || '9200'}"。
常见问题(FAQ)
Q:Systemd 部署怎么传变量? 在 unit 文件用 Environment= 或 EnvironmentFile= 声明。
Q:支持默认值吗? 用 Ruby 的 || 表达式即可实现。