Fluentd has become the popular open source log aggregration framework for a while. I’ll try to give it a spin with Ansible. There are quite some existing Ansible playbooks to install Fluentd out there, but I would like to do it from scratch just to understand how it works.
From the installation guide page, I can grab the script and dependencies and then translate them into Ansible tasks:
--- # roles/fluentd-collector/tasks/install-xenial.yml - name: install os packages package: name: '{{ item }}' state: latest with_items: - libcurl4-gnutls-dev - build-essential - name: insatll fluentd on debian/ubuntu raw: "curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh | sh"
Then it can be included by the main task:
# roles/fluentd-collector/tasks/main.yml # (incomplete) - include: install-debian.yml when: ansible_os_family == 'Debian'
In the log collecting end, I need to configure /etc/td-agent/td-agent.conf to let fluentd(the stable release is call td-agent) receive syslog, tail other logs and then forward the data to the central collector end. Here’s some sample configuration with jinja2 template place holders:
<match *.**> type forward phi_threshold 100 hard_timeout 60s <server> name mycollector host {{ fluent_server_ip }} port {{ fluent_server_port }} weight 10 </server> </match> <source> type syslog port 42185 tag {{ inventory_hostname }}.system </source> {% for tail in fluentd.tails %} <source> type tail format {{ tail.format }} time_format {{ tail.time_format }} path {{ tail.file }} pos_file /var/log/td-agent/pos.{{ tail.name }} tag {{ inventory_hostname }}.{{ tail.name }} </source> {% endfor %}
At the aggregator’s end, a sample configuration can look like:
<source> type forward port {{ fluentd_server_port }} </source> <match *.**> @type elasticsearch logstash_format true flush_interval 10s index_name fluentd type_name fluentd include_tag_key true user {{ es_user }} password {{ es_pass }} </match>
Then the fluentd/td-agent can aggregate all logs from peers and forward to Elasticsearch in LogStash format.
🙂