一、 圖

二、docker-compose
1 定義 Dockerfile
先定義一個 Dockerfile,我們可以從這個 Dockerfile 中構建一個自定義的鏡像,從而獲取到一個我們自定義的容器,
FROM centos:7
RUN yum install -y \
vim bash-com* openssh-clients openssh-server iproute cronie;\
yum group install -y "Development Tools";yum clean all;\
localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV LANG=zh_CN.UTF-8
在上面的 Dockerfile 中,安裝的基本的軟體,和 sshd、crond 服務,
會支持 ssh 遠程連接、計劃任務、ip 命令 ,ss 命令, 還有開發工具,
2 定義 docker-compose
version: '3.8'
services:
slb:
build: .
image: centos7-sshd
privileged: true
command: /usr/sbin/init
hostname: slb
networks:
xiuyun_net:
tomcat1:
image: centos7-sshd
privileged: true
hostname: tomcat1.sharkyun.com
command: /usr/sbin/init
networks:
xiuyun_net:
tomcat2:
image: centos7-sshd
hostname: tomcat2.sharkyun.com
privileged: true
command: /usr/sbin/init
networks:
xiuyun_net:
mysql-master:
image: centos7-sshd
hostname: mysql-master.sharkyun.com
privileged: true
command: /usr/sbin/init
networks:
xiuyun_net:
mysql-slave:
image: centos7-sshd
hostname: mysql-slave.sharkyun.com
privileged: true
command: /usr/sbin/init
networks:
xiuyun_net:
ansible:
image: centos7-sshd
hostname: ansible.sharkyun.com
privileged: true
command: /usr/sbin/init
networks:
xiuyun_net:
networks:
xiuyun_net:
3 啟動
docker-compose up -d
三、實施步驟
1 Ansible 階段
1.1 安裝 阿里云的 epel 源
在 ansible 主機上執行
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
1.2 安裝 ansible
yum install ansible -y
1.3 設定不檢查其他主機的公鑰
在 ansible 主機上修改 檔案 /etc/ansible/ansible.cfg 中如下選項
[defaults]
host_key_checking = False
繼續在 ansible 主機上執行如下命令,創造自己的密鑰對
ssh-keygen -N '' -f ~/.ssh/id_rsa
1.4 建立 hosts 資產清單檔案
在 ansible 主機上創建檔案 hosts.ini ,并寫入如下內容
[nginx]
slb
[tomcat]
tomcat1
tomcat2
[mysql]
mysql-master
mysql-slave
1.5 給需要管理的機器設定 root 密碼
由于這里是使用容器作為虛擬機的,所以默認情況下,root 用戶沒有密碼,需要我們手動設定,
在宿主機上執行如下命令設定密碼
docker-compose exec 服務名稱 bash -c 'echo 密碼 | passwd root --stdin'
docker-compose exec slb bash -c 'echo upsa | passwd root --stdin'
docker-compose exec tomcat1 bash -c 'echo upsa | passwd root --stdin'
docker-compose exec tomcat2 bash -c 'echo upsa | passwd root --stdin'
docker-compose exec mysql-master bash -c 'echo upsa | passwd root --stdin'
docker-compose exec mysql-slave bash -c 'echo upsa | passwd root --stdin'
1.6 傳輸公鑰
以下操作在 ansible 主機上操作
send-pubkey.yml
---
- hosts: all
gather_facts: no
remote_user: root
vars:
ansible_ssh_pass: upsa
tasks:
- name: Set authorized key taken from file
authorized_key:
user: root
state: present
key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
...
執行 playbook
ansible-playbook -i hosts.ini send-pubkey.yml
2 MySQL 階段
2.1 部署MySQL 并啟動 MySQL 服務
mysql/install-mysql.yml
---
- name: 安裝 mysql,并啟動服務
hosts: mysql
gather_facts: no
tasks:
- name: 安裝倉庫檔案
yum:
name: https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
state: present
- name: 禁用 MySQL 8.0 倉庫
ini_file:
path: /etc/yum.repos.d/mysql-community.repo
section: mysql80-community
option: enabled
value: '0'
- name: 啟用 MySQL 5.7 倉庫
ini_file:
path: /etc/yum.repos.d/mysql-community.repo
section: mysql57-community
option: enabled
value: '1'
- name: 安裝 mysql 社區版
yum:
name: mysql-community-server
state: present
- name: start mysql
service:
name: mysqld
state: started
...
執行 playbook
ansible-playbook -i hosts.ini mysql/install-mysql.yml
2.2 設定 MySQL root 用戶的密碼
找到密碼
grep password /var/log/mysqld.log
重新設定密碼
mysqladmin -uroot -p'找到的初始密碼' password '新密碼'
2.3 創庫、創表

創庫: db
create database db default charset utf8mb4 collate utf8mb4_general_ci;
創表: stu
create table db.stu(
id int auto_increment primary key,
name varchar(4),
age int,
phone char(11));
2.4 插入資料
insert into stu(name,age,phone)
values('王麻子',32,'13141098899'),
('九筒',32,'13721096541'),
('六子',18,'13139192657'),
('馬邦德',37,'15855996688');
2.5 查詢資料
-
查詢出 年齡大于 18 的學員姓名
-
統計出年齡 大于等于 32 的學員數量
-
統計出每個年齡段的學員數量–>需要用到分組查詢
-
統計出 年齡在 30 到 50 之間的學員資訊(id,name,age,phone)
-
查出年齡是 32 歲,并且電話號是13721096541 的學員姓名
1. 查詢出 年齡大于 18 的學員姓名
mysql> select name from db.stu where age > 18;
+-----------+
| name |
+-----------+
| 王麻子 |
| 九筒 |
| 馬邦德 |
+-----------+
3 rows in set (0.00 sec)
2. 統計出年齡 大于等于 32 的學員數量
mysql> select count(name) from db.stu where age >= 32;
+-------------+
| count(name) |
+-------------+
| 3 |
+-------------+
1 row in set (0.00 sec)
mysql> select count(name) 數量 from db.stu where age >= 32;
+--------+
| 數量 |
+--------+
| 3 |
+--------+
1 row in set (0.00 sec)
3. 統計出每個年齡段的學員數量–>需要用到分組查詢
mysql> select age 年齡,count(age) 數量 from db.stu group by age;
+--------+--------+
| 年齡 | 數量 |
+--------+--------+
| 18 | 1 |
| 32 | 2 |
| 37 | 1 |
+--------+--------+
3 rows in set (0.00 sec)
假如希望按照數量進行排序
mysql> select age 年齡,count(age) 數量 from db.stu group by age order by 數量;
+--------+--------+
| 年齡 | 數量 |
+--------+--------+
| 18 | 1 |
| 37 | 1 |
| 32 | 2 |
+--------+--------+
3 rows in set (0.00 sec)
4. 統計出 年齡在 30 到 50 之間的學員資訊(id,name,age,phone)
mysql> select id,name,name,age,phone from db.stu where age between 30 and 50;
+----+-----------+-----------+------+-------------+
| id | name | name | age | phone |
+----+-----------+-----------+------+-------------+
| 1 | 王麻子 | 王麻子 | 32 | 13141098899 |
| 2 | 九筒 | 九筒 | 32 | 13721096541 |
| 4 | 馬邦德 | 馬邦德 | 37 | 15855996688 |
+----+-----------+-----------+------+-------------+
3 rows in set (0.00 sec)
5. 查出年齡是 32 歲,并且電話號是13721096541 的學員姓名
mysql> select name from db.stu where age=32 and phone='13721096541';
+--------+
| name |
+--------+
| 九筒 |
+--------+
1 row in set (0.00 sec)
2.4 配置主從復制
2.4.1 修改主服務器的配置
在主服務上操作,設定二進制日志檔案資訊并開啟二進制日志
log-bin=/var/log/mysql/mysql-bin
server-id=1
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
2.5 創建二進制日志檔案路徑,并授權
mkdir /var/log/mysql/
chown mysql.mysql /var/log/mysql
2.6 重啟 主服務器的 MySQL 服務
systemctl restart mysqld
2.7 在主服務上給從庫進行授權
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY '密碼';
2.8 匯出主服務器目前的資料
mysqldump -uroot -p'密碼' --all-databases --master-data=1 > dbdump.db
2.9 將匯出的資料傳遞給從服務器
MySQL 的主服務器上執行
scp dbdump.db root@mysql-slave:/root/
2.10 將資料匯入到從服務器
在從服務器上操作
假如 從服務器的 root 初始密碼沒有修改,需要按照上面 master 提到的方法修改一下
在從服務器 /root/ 目錄下執行下面的命令
mysql -uroot -p'密碼' < dbdump.db
2.11 配置從服務器的 server-id
編輯 /etc/my.cnf 檔案,并添加如下內容
[mysqld]
server-id=2
2.12 重啟服務
systemctl restart mysqld
2.13 在從庫上配置主庫資訊
先查看二進制檔案的同步資訊
[root@mysql-master ~]# grep '^CHANGE' dbdump.db
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=437;
注意這里的二進制檔案名: mysql-bin.000003
位置: 437
登錄到 從庫設定連接到主機的資訊
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl',
MASTER_PASSWORD='密碼',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_AUTO_POSITION=1;
2.14 從服務器啟動 主從復制的行程
mysql> start slave;
2.15 查看是否成功
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: mysql-master
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 437
Relay_Log_File: mysql-slave-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
這樣是查看 IO 行程和 SQL 行程是否都是 OK
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3 Tomcat 階段
3.1 部署 JDK 環境
參考資料:
Ansible 所有的模塊串列
解壓模塊
file 模塊
處理路徑的過濾器
---
- name: 部署 JDK 環境
hosts: tomcat
gather_facts: no
remote_user: root
tasks:
- name: 解壓 jdk 包到指定目錄 /usr/local/
ansible.builtin.unarchive:
src: jdk-8u181.tar.gz
dest: /usr/local/
list_files: yes
register: jdk_dir
- name: 創建軟鏈接,上部解壓后的目錄是 jdk1.8.0_181
ansible.builtin.file:
src: /usr/local/{{ jdk_dir.files.0 | regex_replace('/.*') }}
dest: /usr/local/java
state: link
- name: 設定環境變數
copy:
src: java.sh
dest: /etc/profile.d/java.sh
- name: 驗證是否部署成功
shell: java -version
register: java_version
- name: 輸出驗證資訊
debug:
var: java_version.stderr_lines.0
...
3.2 部署 Tomcat
- name: 部署 tomcat
hosts: tomcat
gather_facts: no
remote_user: root
tasks:
- name: 解壓 tomcat 壓縮包到指定目錄 /usr/local
ansible.builtin.unarchive:
src: tomcat-8.5.63.tar.gz
dest: /usr/local/
list_files: yes
register: ret
- name: 創建軟鏈接
ansible.builtin.file:
src: /usr/local/{{ ret.files.0 | regex_replace('/.*') }}
dest: /usr/local/tomcat
state: link
- name: 設定環境變數
copy:
src: tomcat.sh
dest: /etc/profile.d/tomcat.sh
- name: 驗證是否成功
shell: /usr/local/tomcat/bin/version.sh
register: tomcat_version
- name: 輸出執行命令的結果
when: tomcat_version.rc == 0
debug:
msg: "{{ tomcat_version.stdout_lines.0 }}"
3.3 部署 Java 應用程式
3.3.1 處理應用程式用到的資料庫和表
3.3.2 部署應用,并啟動 tomcat
---
- name: 部署 Java 應用
hosts: tomcat
gather_facts: no
remote_user: root
vars:
url_file: https://www.sharkyun.com:8043/2002/tomcat-app.tar
tasks:
- name: 從一個已知的下載連接,解壓程式包到指定目錄
ansible.builtin.unarchive:
src: "{{ url_file }}"
dest: /tmp/
remote_src: yes
- name: 將已知的解壓后的目錄,移動到指定的發布目錄
shell: cp -ar /tmp/tomcat-app/ROOT/ /usr/local/tomcat/webapps/
- name: 測驗 tomcat 服務是否啟動
shell: jps |grep '[B]ootstrap'
ignore_errors: yes
register: tomcat_process
tags: check
- name: 除錯
debug: var=tomcat_process
tags: check
- name: 停止 tomcat 服務
shell: /usr/local/tomcat/bin/shutdown.sh
when: tomcat_process.rc == 0
tags: stop_tomcat
- name: 啟動 tomcat 服務
shell: nohup /usr/local/tomcat/bin/startup.sh &
tags: start_tomcat
...
4 負載均衡 Nginx 階段
4.1 部署 Nginx
nginx.repo 倉庫檔案
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
playbook
---
- hosts: nginx
gather_facts: no
tasks:
- name: 拷貝 nginx 倉庫檔案
copy:
src: ./nginx.repo
dest: /etc/yum.repos.d/nginx.repo
- name: 安裝 nginx
yum:
name: [nginx]
state: present
- name: 啟動 nginx 服務
systemd:
name: nginx
state: started
...
4.2 配置負載均衡
負載均衡組態檔內容
upstream tomcatapp {
server tomcat1:8080;
server tomcat2:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcatapp;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
playbook
---
- hosts: nginx
gather_facts: no
tasks:
- name: 拷貝 nginx 倉庫檔案
copy:
src: ./nginx.repo
dest: /etc/yum.repos.d/nginx.repo
- name: 安裝 nginx
yum:
name: [nginx]
state: present
- name: 傳輸子組態檔
copy:
src: default.conf
dest: /etc/nginx/conf.d/default.conf
tags: update-conf
- name: 啟動 nginx 服務
systemd:
name: nginx
state: started
tags: update-conf
...
4.3 驗證負載均衡
方式一:
分別查看兩臺 tomcat 的訪問日志,看看有訪問的日志記錄
日志路徑: /usr/local/tomcat/logs/localhost_access_log.*
方式二:
嘗試關閉一臺 tomcat ,之后查看負載均衡 slb 的錯誤日志中是否有記錄
有記錄,說明負載均衡有效果
默認錯誤日志路徑 /var/log/nginx/error.log
下圖中為錯誤日志的部分內容,其中紅框中的 IP 是被關閉 tomcat 服務的機器 IP

5 日志搜集階段
參考資料:
設定Filebeat 模塊與Logstash一起使用
shil:設定Filebeat模塊以使用Kafka和Logstash
此示例的主要目標是演示如何從Filebeat加載攝取管道并將其與Logstash一起使用,
配置 Filebeat 儀表盤
5.1 部署 elasticsearch 集群
5.2 部署 logstash
5.3 部署 filebeat
5.4 配置 Logstash 和 Filebeat
5.4.1 設定并運行Filebeat
如果您尚未設定Filebeat索引模板和示例Kibana儀表板,請運行Filebeatsetup命令以立即執行此操作:
filebeat -e setup
一次性設定步驟需要連接到Elasticsearch和Kibana,因為Filebeat需要在Elasticsearch中創建索引模板并將示例儀表盤加載到Kibana中,有關配置與Elasticsearch的連接的更多資訊,請參閱Filebeat快速入門 ,
加載模板和儀表板后,您將看到如下訊息
{kib} dashboards successfully loaded. Loaded dashboards.
2 運行modules enable命令以啟用要運行的模塊,
filebeat modules enable nginx
可以通過編輯Filebeatmodules.d目錄下的組態檔來進一步配置模塊,例如,如果日志檔案不在模塊期望的位置,則可以設定該var.paths選項,
例如:
3 setup使用指定的–pipelines和–modules選項運行命令,以為已啟用的模塊加載提取管道,此步驟還需要連接到Elasticsearch,如果要使用Logstash管道而不是攝取節點來決議資料,請跳過此步驟
filebeat setup --pipelines --modules system
4 配置Filebeat以將日志行發送到Kafka,為此,在 filebeat.yml組態檔中,通過將其注釋掉來禁用Elasticsearch輸出,然后啟用Kafka輸出,例如:
#output.elasticsearch:
#hosts: ["localhost:9200"]
output.kafka:
hosts: ["kafka:9092"]
topic: "filebeat"
codec.json:
pretty: false
5 啟動 Filebeat
filebeat -e
5.4.2 創建并啟動Logstash管道
1 在安裝Logstash的系統上,創建一個Logstash管道配置,該配置從Kafka輸入讀取并將事件發送到Elasticsearch輸出:
- 使用 filebeat 的攝取管道
input {
kafka {
bootstrap_servers => "myhost:9092"
topics => ["filebeat"]
codec => json
}
}
output {
if [@metadata][pipeline] {
elasticsearch {
hosts => "https://myEShost:9200"
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
pipeline => "%{[@metadata][pipeline]}"
user => "elastic"
password => "secret"
}
} else {
elasticsearch {
hosts => "https://myEShost:9200"
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
user => "elastic"
password => "secret"
}
}
}
將pipeline選項設定為%{[@metadata][pipeline]},此設定將Logstash配置為基于事件中傳遞的元資料選擇正確的接收管道,
- 不使用 Filebeat 的攝取管道,而只使用 Logstash 的管道
如果要使用Logstash管道而不是攝取節點來決議資料,請參閱下面的使用Logstash管道進行決議的示例中的filter和output設定 ,
處理 mysql 日志
此示例中的Logstash管道配置顯示了如何傳送和決議mysqlFilebeat模塊收集的錯誤日志和慢日志 ,
input {
beats {
port => 5044
host => "0.0.0.0"
}
}
filter {
if [fileset][module] == "mysql" {
if [fileset][name] == "error" {
grok {
match => { "message" => ["%{LOCALDATETIME:[mysql][error][timestamp]} (\[%{DATA:[mysql][error][level]}\] )?%{GREEDYDATA:[mysql][error][message]}",
"%{TIMESTAMP_ISO8601:[mysql][error][timestamp]} %{NUMBER:[mysql][error][thread_id]} \[%{DATA:[mysql][error][level]}\] %{GREEDYDATA:[mysql][error][message1]}",
"%{GREEDYDATA:[mysql][error][message2]}"] }
pattern_definitions => {
"LOCALDATETIME" => "[0-9]+ %{TIME}"
}
remove_field => "message"
}
mutate {
rename => { "[mysql][error][message1]" => "[mysql][error][message]" }
}
mutate {
rename => { "[mysql][error][message2]" => "[mysql][error][message]" }
}
date {
match => [ "[mysql][error][timestamp]", "ISO8601", "YYMMdd H:m:s" ]
remove_field => "[mysql][error][time]"
}
}
else if [fileset][name] == "slowlog" {
grok {
match => { "message" => ["^# User@Host: %{USER:[mysql][slowlog][user]}(\[[^\]]+\])? @ %{HOSTNAME:[mysql][slowlog][host]} \[(IP:[mysql][slowlog][ip])?\](\s*Id:\s* %{NUMBER:[mysql][slowlog][id]})?\n# Query_time: %{NUMBER:[mysql][slowlog][query_time][sec]}\s* Lock_time: %{NUMBER:[mysql][slowlog][lock_time][sec]}\s* Rows_sent: %{NUMBER:[mysql][slowlog][rows_sent]}\s* Rows_examined: %{NUMBER:[mysql][slowlog][rows_examined]}\n(SET timestamp=%{NUMBER:[mysql][slowlog][timestamp]};\n)?%{GREEDYMULTILINE:[mysql][slowlog][query]}"] }
pattern_definitions => {
"GREEDYMULTILINE" => "(.|\n)*"
}
remove_field => "message"
}
date {
match => [ "[mysql][slowlog][timestamp]", "UNIX" ]
}
mutate {
gsub => ["[mysql][slowlog][query]", "\n# Time: [0-9]+ [0-9][0-9]:[0-9][0-9]:[0-9][0-9](\\.[0-9]+)?$", ""]
}
}
}
}
output {
elasticsearch {
hosts => localhost
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
}
處理 Nginx 日志
本示例中的Logstash管道配置顯示了如何運送和決議nginxFilebeat模塊收集的訪問和錯誤日??志 ,
input {
beats {
port => 5044
host => "0.0.0.0"
}
}
filter {
if [fileset][module] == "nginx" {
if [fileset][name] == "access" {
grok {
match => { "message" => ["%{IPORHOST:[nginx][access][remote_ip]} - %{DATA:[nginx][access][user_name]} \[%{HTTPDATE:[nginx][access][time]}\] \"%{WORD:[nginx][access][method]} %{DATA:[nginx][access][url]} HTTP/%{NUMBER:[nginx][access][http_version]}\" %{NUMBER:[nginx][access][response_code]} %{NUMBER:[nginx][access][body_sent][bytes]} \"%{DATA:[nginx][access][referrer]}\" \"%{DATA:[nginx][access][agent]}\""] }
remove_field => "message"
}
mutate {
add_field => { "read_timestamp" => "%{@timestamp}" }
}
date {
match => [ "[nginx][access][time]", "dd/MMM/YYYY:H:m:s Z" ]
remove_field => "[nginx][access][time]"
}
useragent {
source => "[nginx][access][agent]"
target => "[nginx][access][user_agent]"
remove_field => "[nginx][access][agent]"
}
geoip {
source => "[nginx][access][remote_ip]"
target => "[nginx][access][geoip]"
}
}
else if [fileset][name] == "error" {
grok {
match => { "message" => ["%{DATA:[nginx][error][time]} \[%{DATA:[nginx][error][level]}\] %{NUMBER:[nginx][error][pid]}#%{NUMBER:[nginx][error][tid]}: (\*%{NUMBER:[nginx][error][connection_id]} )?%{GREEDYDATA:[nginx][error][message]}"] }
remove_field => "message"
}
mutate {
rename => { "@timestamp" => "read_timestamp" }
}
date {
match => [ "[nginx][error][time]", "YYYY/MM/dd H:m:s" ]
remove_field => "[nginx][error][time]"
}
}
}
}
output {
elasticsearch {
hosts => localhost
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
}
處理系統日志
本示例中的Logstash管道配置顯示了如何運送和決議systemFilebeat模塊收集的系統日志 ,
input {
beats {
port => 5044
host => "0.0.0.0"
}
}
filter {
if [fileset][module] == "system" {
if [fileset][name] == "auth" {
grok {
match => { "message" => ["%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} %{DATA:[system][auth][ssh][method]} for (invalid user )?%{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]} port %{NUMBER:[system][auth][ssh][port]} ssh2(: %{GREEDYDATA:[system][auth][ssh][signature]})?",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} user %{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]}",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: Did not receive identification string from %{IPORHOST:[system][auth][ssh][dropped_ip]}",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sudo(?:\[%{POSINT:[system][auth][pid]}\])?: \s*%{DATA:[system][auth][user]} :( %{DATA:[system][auth][sudo][error]} ;)? TTY=%{DATA:[system][auth][sudo][tty]} ; PWD=%{DATA:[system][auth][sudo][pwd]} ; USER=%{DATA:[system][auth][sudo][user]} ; COMMAND=%{GREEDYDATA:[system][auth][sudo][command]}",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} groupadd(?:\[%{POSINT:[system][auth][pid]}\])?: new group: name=%{DATA:system.auth.groupadd.name}, GID=%{NUMBER:system.auth.groupadd.gid}",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} useradd(?:\[%{POSINT:[system][auth][pid]}\])?: new user: name=%{DATA:[system][auth][useradd][name]}, UID=%{NUMBER:[system][auth][useradd][uid]}, GID=%{NUMBER:[system][auth][useradd][gid]}, home=%{DATA:[system][auth][useradd][home]}, shell=%{DATA:[system][auth][useradd][shell]}$",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} %{DATA:[system][auth][program]}(?:\[%{POSINT:[system][auth][pid]}\])?: %{GREEDYMULTILINE:[system][auth][message]}"] }
pattern_definitions => {
"GREEDYMULTILINE"=> "(.|\n)*"
}
remove_field => "message"
}
date {
match => [ "[system][auth][timestamp]", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
geoip {
source => "[system][auth][ssh][ip]"
target => "[system][auth][ssh][geoip]"
}
}
else if [fileset][name] == "syslog" {
grok {
match => { "message" => ["%{SYSLOGTIMESTAMP:[system][syslog][timestamp]} %{SYSLOGHOST:[system][syslog][hostname]} %{DATA:[system][syslog][program]}(?:\[%{POSINT:[system][syslog][pid]}\])?: %{GREEDYMULTILINE:[system][syslog][message]}"] }
pattern_definitions => { "GREEDYMULTILINE" => "(.|\n)*" }
remove_field => "message"
}
date {
match => [ "[system][syslog][timestamp]", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
}
output {
elasticsearch {
hosts => localhost
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
}
2 啟動Logstash,傳入您剛定義的管道組態檔,例如:
bin/logstash -f mypipeline.conf
Logstash應該啟動管道并開始從Kafka輸入接收事件,
5.4.3 可視化資料
要可視化Kibana中的資料,請通過將瀏覽器指向埠5601來啟動Kibana Web界面,例如,http://127.0.0.1: 5601 ,單擊儀表板,然后查看Filebeat儀表板,
6 監控 Zabbix 階段
6.1 部署 Zabbix Server
6.2 部署 Zabbix Agent
6.3 添加主機組和主機
6.4 添加監控項
6.5 添加觸發器
6.6 添加報警媒介
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/263304.html
標籤:其他
上一篇:HO引擎近況20210225
下一篇:CenOS7 運維 - DNS域名決議服務 | 正向決議 | 反向決議 | 主從服務器實時同步 | 分離決議 | 排錯思路及方案 | 超詳細
