如何在运行于Docker中的Graylog2服务器上自动创建UDP输入?

13
我们在开发环境中运行了一个Graylog2服务器,它位于Docker容器中。它工作得很好,但每次启动容器时都必须重新创建UDP输入,这是唯一的问题。
是否有人找到了自动创建Graylog2输入的便捷方法?

你有没有找到这个问题的答案?我正尝试做同样的事情。 - Kryten
就我所知,我已经解决了一部分问题。输入数据存储在Mongo数据库中,因此如果您将MongoDB存储在持久卷中,则应该能够持久保存,对吗?然而,不幸的是,每次容器重新启动时,Graylog2都会生成一个新的节点ID,并且输入与节点ID相关联。所以我需要想出如何使节点ID静态... - Kryten
嗨,我已经实现了80%的解决方案。我扩展了 qnib/graylog 镜像,以便直接将所需配置插入 MongoDB 中。这是一种相当恶劣的解决方案,但它有点起作用。 - Kimble
9个回答

18
在新创建的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之前,请参见this pull request)。
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-input-graylog.json (3.0 之前版本):

{
  "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":[]
}

要获得与3.0兼容的内容包JSON,只需通过GUI创建输入,然后通过GUI创建并下载内容包即可。

无法在Graylog 3上工作-https://github.com/Graylog2/graylog2-server/pull/5070 - Artur Babyuk
谢谢,我已经将您的评论修改为答案。如果我们找到了解决方法,我们应该更新这个答案 :-) - flob
1
这将在Graylog 3.2中再次起作用。只有一个更改: ENV GRAYLOG_CONTENT_PACKS_AUTO_INSTALL udp-input-graylog.json 因此,在env名称的末尾使用“INSTALL”而不是“LOAD”。 - T. van den Berg
如果我有多个内容包JSON文件,GRAYLOG_CONTENT_PACKS_AUTO_INSTALL只接受一个文件作为输入吗? - user3453552

4

使用 contentpack 创建多个输入的步骤:

  • Write them into a file with json format (e.g.)

    {"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":[]
      }]
    }  
    
  • copy the contentpack to the contentpacks directory in graylog using ansible

      - name: create graylog inputs for receiving logs
        shell: cp .templates/inputs.json /usr/share/graylog-server/contentpacks/inputs.json
    
  • Set contentpacks autoload to True in graylog.conf or via ansible

      graylog_content_packs_loader_enabled: true
    
  • Set contentpacks autoload to load inputs.json (e.g. via ansible)

      graylog_content_packs_auto_load: inputs.json
    
希望这能帮到你!

3

我使用ansible在容器中启动和准备graylog2。在graylog2的自动配置完成后,我通过调用graylog2 rest api创建全局udp输入:

- 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]


3
如果有帮助的话,可以使用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

1

我基于Graylog内容包发布了一个稍微更优雅的解决方案来解决这个问题。 - Kimble

1
我们有一个与此相关的木偶解决方案(graylog2 v2.2.2)。基本上,在server.conf中启用内容包,并列出将作为您的json内容的相关文件(请参见上面有关UDP输入的漂亮示例)。在配置的目录中(默认为/usr/share/graylog-server/contentpacks),在graylog服务器上放置了一个puppet文件资源。这将在第一次运行graylog时加载。这是一个很好的获取大量配置的方式。

0

在折腾了一段时间后,我想出了一个权宜之计。这可能不是最好的解决方法,但是文件很少,而且似乎可以工作(但是请参见本帖子末尾的注意事项)。

问题在于每次重新启动Graylog2容器时,服务器都会生成一个新的唯一节点ID。通过Web界面定义的输入与特定节点ID相关联。因此,每当节点ID更改时,您定义的输入就变得无用了。

解决方案有两个部分:

  1. 确保MongoDB将其数据存储在某个持久位置 - 要么是数据容器,要么是从主机文件系统挂载的目录。

  2. 强制容器每次使用相同的节点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应用程序的输入。我不知道在集群的一部分时会发生什么。


0
另一种选择是将您的输入创建为“全局” - 这样无论为当前实例生成的节点ID如何,您都将返回所有配置的全局输入。

0

答案中提供的内容包 json 对我无效。 我遇到了一个错误:

ERROR:org.graylog2.periodical.ContentPackLoaderPeriodical - 周期性未捕获的异常java.lang.IllegalArgumentException: 不支持的内容包版本:0

然而,结果证明创建内容包本身是一个简单且直接的过程。

  1. 在 Graylog 的当前实例中创建所有所需实体,例如输入
  2. 转到“内容包”菜单
  3. 点击“创建内容包”按钮
  4. 提供详细信息,使用复选框选择要包含的实体并点击“下一步”按钮
  5. 如果需要,请提供参数,然后点击“下一步”按钮
  6. 点击“创建并下载”按钮。 将下载内容包的 json。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接