1. 程式人生 > 其它 >filebeat自動獲取ip

filebeat自動獲取ip

預設情況下filebeat只能獲取本機的host,不能將本機的ip傳遞到logstash,但是機器的主機名會變化,或者通過克隆的方式產生的機器的主機名都一樣,改主機名比較麻煩,這就造成檢視日誌的時候不能分辨日誌來自哪臺機器,極大的影響了問題的排查。
但是直接用系統環境變數會出現以下問題:CRIT Exiting: error loading states for prospector 0: missing field accessing

前提

  • OS: centos 7+
  • filebat的啟動方式是systemd,且內容為下:
[Unit]
Description=filebeat
Documentation=https://www.elastic.co/guide/en/beats/filebeat/current/index.html
Wants=network-online.target
After=systemd-setenv.service

[Service]
ExecStart=/usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat_nodejs.yml -path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat_nodejs -path.logs /var/log/filebeat_nodejs
Restart=always

[Install]
WantedBy=multi-user.target

** 注意Unit裡面的After **

  • 加入開機自啟:
systemctl daemon-reload
systemctl enable filebeat.service

配置

配置環境變數

編輯/usr/lib/systemd/system/systemd-setenv.service

[Unit]
Description=Transfers /etc/environment to systemd
Requires=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/bash -c "/usr/bin/systemctl set-environment SERVER_IP=`ip a | grep inet  | grep brd  | grep -v docker | awk -F '[ |/]+' '{print $3}'`"

[Install]
WantedBy=multi-user.target

加入開機自啟:

systemctl daemon-reload
systemctl enable systemd-setenv.service

原理

預設情況下系統的環境變數只有通過pam方式登入的使用者才能讀取到,但是systemd是不會進行登入的,所以就不能直接讀取到系統的環境變數,但是可以通過systemctl import-environment var=value 或者 systemctl set-environment var=valua 方式給systemd配置環境變數,前者是直接匯入系統的環境變數,後者是自定義,但是systemd不提供任何永久性的東西,上面的配置只是臨時的,再系統重啟之後就會消失。
所以針對上面的問題,需要再開機啟動的時候加環境變數匯入,現在又有另外2個問題:

  • 怎麼才能在伺服器啟動的時候獲取到正確的伺服器ip
  • 怎麼固定我們需要的順序即:ip--> 變數 --> 服務

針對上面的兩個問題我們根據systemd的特性做了上面的配置/usr/lib/systemd/system/systemd-setenv.service,首先我們可以看到它的systemd的啟動指令碼中有After=network-online.target,這就意味在我們的服務啟動是在網路啟動好之後,再看filebeatsystemd啟動指令碼中有After=systemd-setenv.service,意味著它是再環境變數匯入之後進行的,所以可以保證filebeat通過systemd啟動的時候可以讀到環境變數
下面是filebeat.yml的內容:

filebeat.prospectors:
- type: log
  enabled: true
  paths:
    - /var/log/*.log
  fields:
    hostIp: ${SERVER_IP}
  fields_under_root: true
  tail_files: true
  exclude_lines: ["goreplay=1"]
  scan_frequency: 5s
  close_inactive: 1m
  max_bytes: 104857600
  harvester_buffer_size: 163840 
  ignore_older: 2h
  backoff: 1s
  max_backoff: 5s

output.logstash:
  hosts: ["0.0.0.0:5046"]
  bulk_max_size: 8192
  pipelining: 10
  worker: 6

#
#
filebeat.registry_file: /var/lib/filebeat/nodejs_registry

systemd中文教程

以上