Fluentd 配置中环境变量的实战用法
Fluentd 通过 "#{ENV['VAR']}" 语法在配置中引用环境变量,典型用于密钥外置、多环境复用与容器化部署。本文给出完整示例、默认值写法与 Systemd/Docker/K8s 三种注入方式。
核心语法一行:"#{ENV['ES_HOST']}"——Fluentd 加载配置时执行 Ruby 表达式完成替换。掌握它就掌握了配置与密钥分离的关键手段。
完整示例
<source>
@type forward
port "#{ENV['FLUENT_PORT'] || '24224'}"
</source>
<match **>
@type elasticsearch
host "#{ENV.fetch('ES_HOST', 'localhost')}"
user "#{ENV['ES_USER']}"
password "#{ENV['ES_PASSWORD']}"
</match>
注意 ENV.fetch('ES_HOST', 'localhost') 的默认值写法比 || 更严谨(区分未设置与空字符串)。
三种环境的注入方式
Systemd:
[Service]
Environment="ES_HOST=es.internal"
EnvironmentFile=/etc/fluentd/secrets.env
Docker:
docker run -e ES_HOST=es.internal -e ES_PASSWORD=$(cat /run/secrets/es_pw) fluentd
Kubernetes:
env:
- name: ES_PASSWORD
valueFrom:
secretKeyRef: {name: es-secret, key: password}
排错技巧
变量替换失败最常见的是未 export 或进程环境隔离——用 fluentd --dry-run -c fluent.conf 预检,或在配置里临时加一行把变量值输出到日志验证。
观测云对照
观测云 DataKit 在配置中以 $ENV{VAR} 形式引用环境变量,同样的密钥外置思路;K8s 场景官方 datakit.yaml 已预置好 DataWay 地址与 Token 的注入位。
常见问题(FAQ)
Q:数组/列表配置能用变量吗? 可以,Ruby 表达式返回什么就用什么:"#{ENV['HOSTS'].split(',')}"。
Q:改环境变量后需要重启吗? 需要——变量在配置加载时替换,热重载(reload)也会重新读取当前环境。