用于将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上创建了一个虚拟机进行测试。配置如下所示。
在这里,我们在一个Azure的虚拟网络中准备了两台虚拟机。
-
- CoreOS Stable … Ansibleを動かすコンテナ / Fluentdを動かすコンテナ
- Windows Server 2012 R2 … イベントログの監視対象
我们准备了一个Fluentd容器作为CoreOS的syslog接口,并通过在CoreOS上的Ansible容器安装NXLog到Windows Server,从而通过syslog将事件日志流式传输到这个Fluentd。
操作步骤
虚拟机的启动
这次我们将尝试从Microsoft Azure的仪表板进行操作。
-
- 准备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虚拟机并进行以下操作:
-
- 将设置文件写入。这次,将内容写入到文件/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准备部分。
用远程桌面连接到虚拟机,并按以下方式操作。
-
- 登录时,关于网络的查询将显示在个人电脑或设备上,选择[是]。
-
- 或者,通过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的主机并进行以下操作。
-
- 使用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仓库即可。
下面是所进行的流程。
-
- 克隆試用Playbook
-
- # 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中。所以就是这样。