用于将Windows事件日志流向Syslog的Ansible Playbook

借助Ansible的能力,我们可以通过一次操作来处理数十台服务器,借助Fluentd的能力可以轻松实现整体信息聚合。这使得处理大量服务器变得非常简单。

考虑到这种自动化,Windows Server会稍微麻烦一些。虽然我们希望统一使用Linux,但是在某些情况下,使用Windows Server搭建会更方便,而且可能会遇到几台Windows Server混杂的情况,让人非常困扰。

因此,我尝试使用Ansible来安装和配置用于汇总Windows Server事件日志的软件。感觉还挺简单的,所以做了一些笔记。

相关技术

使用Ansible来操作Windows

Ansible基本上會通過SSH連接到目標服務器並使用目標服務器的Python環境來執行各種處理。而對於Windows目標服務器,則使用WinRM(Windows遠程管理)來連接並使用PowerShell來執行各種處理。

在Windows环境中,需要PowerShell 3.0及网络设置,以下提供了非常清晰易懂的总结。

    AnsibleでWindowsを操作する準備をする

这次作为尝试,我们准备在Microsoft Azure上创建一个Windows Server 2012 R2的虚拟机,并尝试使用Ansible进行操作。

收集Windows事件日志

有几种方法可以将Windows的事件日志收集到Fluentd中,但我决定参考以下方法,使用NXLog通过syslog进行收集。

    • Collecting Log Data from Windows

 

    Windows のイベントログを fluentd で何とか出来ないか調べてみたら nxlog を組み合わせることで…

顺便说一下,虽然这次没有尝试,但好像还有一个叫作fluent-plugin-winevtlog的插件,听起来非常有趣…!

    Windowsイベントログをfluentdプラグインで集めてmongoDBに突っ込む

尝试一下

我把尝试的 Playbook 放在了 https://github.com/yacchin1205/nxlog-ansible 上。

在中国,下面是对Playbook的原文的中文翻译:

Playbook相对简单,在roles/nxlog/tasks/main.yml文件中,

- name: Download NXLog
  win_get_url: url=http://nxlog.org/system/files/products/files/1/nxlog-ce-2.9.1347.msi dest="C:\Users\{{ ansible_ssh_user }}\Downloads\nxlog-ce.msi"

- name: Install NXLog
  win_msi: path="C:\Users\{{ ansible_ssh_user }}\Downloads\nxlog-ce.msi"

- name: Copy configuration for NXLog
  win_template: src=nxlog.conf.j2 dest="C:\Program Files (x86)\nxlog\conf\nxlog.conf"
  notify: Restart NXLog

- name: Start NXLog
  win_service: name=nxlog start_mode=auto state=started

使用win_*模块可以轻松地完成想要做的事情。如果要更改NXLog的配置文件,只需修改roles/nxlog/templates/nxlog.conf.j2即可。

以下是我创建和测试的配置和步骤的简要情况。

组成

为了避免本次失败而导致死亡,我在Microsoft Azure上创建了一个虚拟机进行测试。配置如下所示。

2015-08-291.jpg

在这里,我们在一个Azure的虚拟网络中准备了两台虚拟机。

    • CoreOS Stable … Ansibleを動かすコンテナ / Fluentdを動かすコンテナ

 

    Windows Server 2012 R2 … イベントログの監視対象

我们准备了一个Fluentd容器作为CoreOS的syslog接口,并通过在CoreOS上的Ansible容器安装NXLog到Windows Server,从而通过syslog将事件日志流式传输到这个Fluentd。

操作步骤

虚拟机的启动

这次我们将尝试从Microsoft Azure的仪表板进行操作。

    1. 准备Windows Server 2012 R2虚拟机。本次参数如下:

镜像:Windows Server 2012 R2 Datacenter
版本发布日期:2015/07/26(选择最新版本)
虚拟机名称:随意取名
层级:STANDARD
大小:D1(1个核心,3.5GB内存)
新用户名:随意取名
新密码:设置适当的密码

准备CoreOS虚拟机。参数如下:

镜像:CoreOS Stable
版本发布日期:2015/08/04(选择最新版本)
虚拟机名称:随意取名
层级:STANDARD
大小:A2(2个核心,3.5GB内存)
新用户名:随意取名
认证:设置适当的认证方式

由于本次将Windows Server和Ansible环境放置在同一虚拟网络中,所以并不太在意。但是,如果要从虚拟网络外的Ansible环境操作Windows Server,则需要确认终结点是否已设置为PowerShell(5986端口)。

准备Fluentd。

这次只需要确认通过syslog接收到的内容是否能够通过标准输出进行检查,所以我只进行了简单的配置,使用了syslog输入和标准输出插件。
我将使用 https://github.com/fluent/fluentd-docker-image 镜像来实现这个想法。

登陆到在Azure上创建的CoreOS虚拟机并进行以下操作:

    1. 将设置文件写入。这次,将内容写入到文件/home/(user)/fluentd/test-syslog.conf中,内容如下:

@type syslog
port 5140
bind 0.0.0.0
tag system

@type stdout

运行Fluentd容器。指定镜像为fluent/fluentd即可。

$sudo docker run -d -p 5140:5140/udp -v /home/(user)/fluentd:/fluentd/etc -e FLUENTD_CONF=test-syslog.conf fluent/fluentd

使用这个选项,Fluentd容器将被启动,并且syslog输入插件将能够接收来自主机UDP 5140端口的数据包。收到的syslog内容将被输出到标准输出,您可以使用docker logs命令进行确认。

准备Windows Server

请将Windows Server进行设置更改,以便接受来自Ansible的WinRM请求。有关详细信息,请参阅在Ansible中准备操作Windows的#Windows准备部分。

用远程桌面连接到虚拟机,并按以下方式操作。

    1. 登录时,关于网络的查询将显示在个人电脑或设备上,选择[是]。

 

    1. 或者,通过PowerShell输入以下命令,将网络更改为私人网络。

PS> Set-NetConnectionProfile -InterfaceAlias(Get-NetConnectionProfile -IPv4Connectivity Internet).InterfaceAlias -NetworkCategory Private

打开PowerShell,并输入以下命令。

PS> cd Downloads
PS> Invoke-WebRequest -Uri https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1 -OutFile ConfigureRemotingForAnsible.ps1
PS> powershell -ExecutionPolicy RemoteSigned .\ConfigureRemotingForAnsible.ps1

如果输出为“Ok。”,则应该已经通过WinRM可以操作Ansible。
接下来创建Ansible环境,并尝试操作这台Windows Server来确认一下。

准备Ansible

我将通过SSH连接到CoreOS的主机并进行以下操作。

    1. 使用pip来安装ansible和pywinrm。由于此次准备使用ubuntu:14.04容器,因此以下是一种安装方法:

$ sudo docker run -it ubuntu:14.04
# apt-get update && apt-get install -y python-pip python-dev git vim
# pip install ansible pywinrm

创建清单文件。在任意目录下创建一个名为test-hosts的文件,并按照以下格式描述Windows Server的信息:

[windows]
10.0.0.5 # Windows Server主机名/地址

[windows:vars]
ansible_ssh_user=
ansible_ssh_pass=
ansible_ssh_port=5986
ansible_connection=winrm

指定所描述的清单,并执行win_ping模块

# ansible -i test-hosts -m win_ping all

如果输出为”ping”: “pong”等则可以。如果发生错误,则可以使用-vvv等选项追踪处理并找出原因。

使用Ansible在Windows Server上安装并配置NXLog。

在安装了Ansible的容器内,只需要克隆并执行https://github.com/yacchin1205/nxlog-ansible仓库即可。

下面是所进行的流程。

    1. 克隆試用Playbook

 

    1. # git clone https://github.com/yacchin1205/nxlog-ansible.git

創建清單。在存儲庫中有一個名為hosts.template的文件,將其用作基礎…

# cd nxlog-ansible
# cp hosts.template hosts
# vim hosts

將hosts編輯為以下內容。在此示例中,將syslog發送目標的信息寫入清單。
[windows]
10.0.0.5 # Windows Server主機名/地址

[windows:vars]
ansible_ssh_user=
ansible_ssh_pass=
ansible_ssh_port=5986
ansible_connection=winrm
# syslog運行的主機和端口
syslog_host=10.0.0.4
syslog_port=5140

執行Playbook
# ansible-playbook -i hosts nxlog.yml

10.0.0.5 : ok=6 changed=5 unreachable=0 failed=0

只要处理顺利完成,没有失败的情况就可以了。

确认动作

然后,查看Fluentd容器的标准输出内容,确认是否输出了类似于Windows Server事件日志的内容。
例如,当尝试通过RDP访问Windows Server时,将会输出以下类似的日志。

$ sudo docker ps | grep fluentd
19140d80315a        fluent/fluentd:latest   "/bin/sh -c 'fluentd   3 minutes ago       Up 3 minutes        0.0.0.0:5140->5140/udp, 24224/tcp   serene_jang      

$ sudo docker logs 19140d80315a

...

2015-08-29 01:27:30 +0000 system.user.info: {"host":"yzwlab-win","ident":"MSWinEventLog","message":"27:29 2015\t131\tMicrosoft-Windows-RemoteDesktopServices-RdpCoreTS\tNETWORK SERVICE\tWell Known Group\tInformation\tyzwlab-win\tRemoteFX module\t\tThe server accepted a new TCP connection from client xxx.xxx.xxx.xxx:yyyy.\t53"}
2015-08-29 01:27:30 +0000 system.user.info: {"host":"yzwlab-win","ident":"MSWinEventLog","message":"27:29 2015\t65\tMicrosoft-Windows-RemoteDesktopServices-RdpCoreTS\tNETWORK SERVICE\tWell Known Group\tInformation\tyzwlab-win\tRemoteFX module\t\tConnection RDP-Tcp#2 created \t54"}

通过Fluentd可能追踪在Windows Server上发生的事件…!

也许需要修改Playbook的roles/nxlog/templates/nxlog.conf.j2来适应实际使用情况(例如字符编码等)。
但是,通过这样的方式,似乎可以使用Ansible批量操作,将Windows Server的事件日志集中到syslog中。所以就是这样。

广告
将在 10 秒后关闭
bannerAds