我们在开发环境的 Docker 容器中运行 Graylog2 服务器。除了我们每次启动容器时都必须重新创建 UDP 输入这一事实之外,它的作用就像一个魅力。
有没有人想出一种方便的方法来自动创建 Graylog2 输入?
在新创建的docker 容器中使用自动加载的内容包。
Dockerfile(从 Graylog 3.2 开始 - 感谢 T. van den Berg):
FROM graylog2/server:latest
COPY udp-input-graylog.json /usr/share/graylog/data/contentpacks
ENV GRAYLOG_CONTENT_PACKS_AUTO_INSTALL udp-input-graylog.json
ENV GRAYLOG_CONTENT_PACKS_LOADER_ENABLED true
ENV GRAYLOG_CONTENT_PACKS_DIR data/contentpacks
Dockerfile(3.0 之前,请参阅 此拉取请求)。:
FROM graylog2/server:latest
COPY udp-input-graylog.json /usr/share/graylog/data/contentpacks
ENV GRAYLOG_CONTENT_PACKS_AUTO_LOAD udp-input-graylog.json
ENV GRAYLOG_CONTENT_PACKS_LOADER_ENABLED true
ENV GRAYLOG_CONTENT_PACKS_DIR data/contentpacks
udp-输入-graylog.json:
{
"name":"UDP GELF input on 12201",
"description":"Adds a global UDP GELF input on port 12201",
"category":"Inputs",
"inputs":[
{
"title":"udp input",
"configuration":{
"override_source":null,
"recv_buffer_size":262144,
"bind_address":"0.0.0.0",
"port":12201,
"decompress_size_limit":8388608
},
"static_fields":{},
"type":"org.graylog2.inputs.gelf.udp.GELFUDPInput",
"global":true,
"extractors":[]
}
],
"streams":[],
"outputs":[],
"dashboards":[],
"grok_patterns":[]
}
使用内容包创建多个输入的步骤:
将它们写入 json 格式的文件(例如)
{"id" : null,
"name":" Inputs",
"description":"Contentpack that adds global inputs",
"category":"Inputs",
"inputs":[
{
"title":"udp input",
"configuration":{
"override_source":null,
"recv_buffer_size":262144,
"bind_address":"0.0.0.0",
"port":12201,
"decompress_size_limit":8388608
},
"static_fields":{},
"type":"org.graylog2.inputs.gelf.udp.GELFUDPInput",
"global":true,
"extractors":[]
},
{
"title":"tcp input",
"configuration":{
"override_source":null,
"recv_buffer_size":262144,
"bind_address":"0.0.0.0",
"port":12202,
"decompress_size_limit":8388608
},
"static_fields":{},
"type":"org.graylog2.inputs.gelf.tcp.GELFTCPInput",
"global":true,
"extractors":[]
}]
}
使用 ansible 将 contentpack 复制到 graylog 中的 contentpacks 目录
- name: create graylog inputs for receiving logs
shell: cp .templates/inputs.json /usr/share/graylog-server/contentpacks/inputs.json
将 contentpacks 自动加载设置为True
ingraylog.conf
或通过 ansible
graylog_content_packs_loader_enabled: true
设置 contentpacks 自动加载以加载inputs.json
(例如通过 ansible)
graylog_content_packs_auto_load: inputs.json
希望这可以帮助!
我使用 ansible 在容器中启动和准备 graylog2。我只是通过调用 graylog2 rest api 创建全局 udp 输入(在 graylog2 自动配置完成后):
- name: create graylog global udp input for receiving logs
uri:
url: http://{{ ipv4_address }}:9000/api/system/inputs
method: POST
user: "{{ graylog_admin }}"
password: "{{ graylog_pwd }}"
body: '{"title":"xxx global input","type":"org.graylog2.inputs.gelf.udp.GELFUDPInput","configuration":{"bind_address":"0.0.0.0","port":12201,"recv_buffer_size":262144,"override_source":null,"decompress_size_limit":8388608},"global":true}'
force_basic_auth: yes
status_code: 201
body_format: json
[ansible] [docker] [graylog2]
最后,这对我有用。我最终将相关配置直接插入到 MongoDB 中。
我们为此提供了一个傀儡解决方案(graylog2 v2.2.2)。基本上在 server.conf 中启用内容包,并列出将成为您的 json 内容的相关文件(参见上面的 UDP 输入作为一个很好的例子)。只需将 puppet 中的文件资源放在配置的目录中的 graylog 服务器上(默认为 /usr/share/graylog-server/contentpacks)
这将在第一次运行 graylog 时加载。
这是获取大量配置的好方法。
如果有帮助,请使用 graylog3 REST API 创建任意输入。我想一旦 graylog-api 可用,可能会使用下面的示例 bash 脚本来调用。
#!/bin/bash
if [ `curl -s -u admin:admin -H 'Content-Type: application/json' -X GET 'http://graylog:9000/api/system/inputs' | grep -c 'Standard GELF UDP input'` == 0 ]
then
curl -u admin:admin -H 'Content-Type: application/json' -X POST 'http://graylog:9000/api/system/inputs' -d '{
"title": "Standard GELF UDP input",
"type": "org.graylog2.inputs.gelf.udp.GELFUDPInput",
"global": true,
"configuration": {
"recv_buffer_size": 1048576,
"tcp_keepalive": false,
"use_null_delimiter": true,
"number_worker_threads": 2,
"tls_client_auth_cert_file": "",
"bind_address": "0.0.0.0",
"tls_cert_file": "",
"decompress_size_limit": 8388608,
"port": 12201,
"tls_key_file": "",
"tls_enable": false,
"tls_key_password": "",
"max_message_size": 2097152,
"tls_client_auth": "disabled",
"override_source": null
},
"node": null
}' -H 'X-Requested-By: cli'
else
echo "Standard GELF UDP input exists already"
fi
在搞砸了一段时间之后,我想出了一个kludge。这可能不是最好的方法,但是文档很少,而且似乎可以工作(但是,请参阅本文末尾的警告)。
问题是每次重新启动 Graylog2 容器时,服务器都会生成一个新的唯一节点 ID。您通过 Web 界面定义的输入与特定的节点 ID 相关联。因此,每次节点 ID 更改时,您定义的输入都会变得无用。
解决方案有两个部分:
确保 MongoDB 将其数据持久存储在某个地方——数据容器或从主机文件系统挂载的目录中。
强制容器每次使用相同的节点 ID。我通过扩展sjoerdmulder/graylog2图像来做到这一点:
这是 Dockerfile:
FROM sjoerdmulder/graylog2
# set a Graylog2 node ID
#
RUN echo "mynodeid" > /opt/graylog2-server/server-node-id
RUN chmod 0444 /opt/graylog2-server/server-node-id
这会将“mynodeid”写入适当的文件并通过更改权限对其进行写保护。然后服务器正常启动并加载适当的节点 ID。现在您可以进入 Web 界面,创建输入,并确信下次启动容器时,它仍然会存在。
我没有使用集群。我只是运行 Graylog2 的单个实例,接受来自单个 Web 应用程序的输入。我不知道当它是集群的一部分时会做什么。
另一种选择是将您的输入创建为“全局” - 这样无论为当前实例生成的节点 ID 是什么,您都将取回所有已配置的全局输入。
答案中提供的内容包 json 对我不起作用。我收到一个错误:
错误:org.graylog2.periodical.ContentPackLoaderPeriodical - 定期 java.lang.IllegalArgumentException 中未捕获的异常:不支持的内容包版本:0
然而,事实证明,创建内容包本身是一个简单直接的过程。