Дипломная работа: Автоматизация доставки программного обеспечения при помощи DevOps практик и инструментов в облаке AWS в компании ООО "Команда Лабс"

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
141
file:
path: /etc/logstash/aws_opsgenie/
state: directory
owner: logstash
group: logstash
mode: 0775
- name: Creates directory aws_nginx
file:
path: /etc/logstash/aws_nginx/
state: directory
owner: logstash
group: logstash
mode: 0775
- name: Create Logstash filebeat pipeline configuration files.
template:
src: "{{ item }}.j2"
dest: "/etc/logstash/aws_filebeat/{{ item }}"
owner: logstash
group: logstash
mode: 0644
with_items:
- 01-beats-input.conf
- 11-nginx.conf
- 31-elasticsearch-filebeat-output.conf
notify: restart logstash
- name: Create Logstash filebeat pipeline configuration files.
template:
src: "{{ item }}.j2"
dest: "/etc/logstash/aws_logstash/{{ item }}"
owner: logstash
group: logstash
mode: 0644
with_items:
- 01-cloudwatch-logs-input.conf
- 30-elasticsearch-logstash-output.conf
notify: restart logstash
- name: Create CloudWatch Nginx pipeline configuration files.
template:
src: "{{ item }}.j2"
dest: "/etc/logstash/aws_nginx/{{ item }}"
owner: logstash
group: logstash
mode: 0644
with_items:
- 04-cloudwatch-nginx-logs-input.conf
- 34-elasticsearch-logstash-nginx-output.conf
- 14-nginx-logstash.conf
notify: restart logstash
- name: Create Logstash filebeat pipeline configuration files.
142
template:
src: "{{ item }}.j2"
dest: "/etc/logstash/aws_opsgenie/{{ item }}"
owner: logstash
group: logstash
mode: 0644
with_items:
- 01-cloudwatch-logs-input.conf
- 02-opsgenie-output.conf
- 03-opsgenie-filter.conf
notify: restart logstash
- name: Create Logstash pipeline and configuration files.
template:
src: "{{ item }}.j2"
dest: "/etc/logstash/{{ item }}"
owner: logstash
group: logstash
mode: 0644
with_items:
- logstash.yml
- pipelines.yml
notify: restart logstash
Сбор логов из CloudWatch
input {
cloudwatch_logs {
start_position => "end"
log_group => ["{{ logstash.log_group_nginx }}"]
access_key_id => "{{ logstash.aws_access_key_id }}"
secret_access_key => "{{ logstash.aws_secret_access_key }}"
log_group_prefix => "true"
region => "{{ logstash.region }}"
}
}
Темплейт обработки логов Nginx
filter {
if [event][module] == "nginx" {
if [fileset][name] == "access" {
grok {
match => { "message" => ["%{IPORHOST:remote_ip} - %{DATA:user_name}
\[%{HTTPDATE:access_time}\] \"%{DATA:referrer}\" \"%{WORD:http_method} %{DATA:url}
HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_sent_bytes}
\"%{DATA:agent}\" \"-\" \[%{BASE10NUM:request_time}
%{BASE10NUM:upstream_response_time} %{GREEDYDATA:pipe}\] \[%{NUMBER:connection}
%{NUMBER:connection_requests}"] }
remove_field => "message"
}
mutate {
143
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]"
}
}
}
}
Фильтрация и обработка логов для отправки в OpsGenie
filter {
mutate{
add_field => {
"alias" => "%{[cloudwatch_logs][event_id]}"
"opsgenieAction" => "create"
"description" => "%{stack_trace}"
"tags" => ["{{ logstash.profile }}", "%{[cloudwatch_logs][ingestion_time]}",
"%{[cloudwatch_logs][event_id]}"]
"[details][organizationId]"=> "%{organizationId}"
"[details][channelId]" => "%{channelId}"
"[details][messageId]" => "%{messageId}"
"[details][flowId]" => "%{flowId}"
"[details][externalPropertyId]" => "%{externalPropertyId}"
"[details][repositoryId]" => "%{repositoryId}"
"[details][propertyCode]" => "%{propertyCode}"
"[details][chainCode]" => "%{chainCode}"
"[details][outboundChannelId]" => "%{outboundChannelId}"
144
"[details][recordType]" => "%{recordType}"
"[details][cloudWatchTime]" => "%{[cloudwatch_logs][ingestion_time]}"
"[details][logger_name]" => "%{[logger_name]}"
"priority" => "{{ logstash.priority }}"
"source" => "{{ logstash.profile }}"
"entity" => "%{app}"
}
}
ruby {
code => "event.set('teams', [{'name' => '{{ logstash.team }}'}])"
}
}
Отправка логов в систему алертинга OpsGenie:
output {
if [level] == 'ERROR' {
opsgenie {
apiKey => '{{ logstash.token }}'
}
}
}
Отправка логов в базу данных ElasticSearch
output {
if [level] in ["DEBUG","TRACE"] {
amazon_es {
hosts => ["{{ logstash.output_hosts }}"]
region => "{{ logstash.region }}"
aws_access_key_id => "{{ logstash.elastic_key_id | default(logstash.aws_access_key_id) }}"
aws_secret_access_key => "{{ logstash.elastic_secret_access_key |
default(logstash.aws_secret_access_key) }}"
index => "logstash-debug-%{+YYYY.MM.dd}"
}
} else {
amazon_es {
hosts => ["{{ logstash.output_hosts }}"]
region => "{{ logstash.region }}"
aws_access_key_id => "{{ logstash.elastic_key_id | default(logstash.aws_access_key_id) }}"
aws_secret_access_key => "{{ logstash.elastic_secret_access_key |
default(logstash.aws_secret_access_key) }}"
index => "logstash-info-%{+YYYY.MM.dd}"
}
}
}
Пайплайны обработки данных внутри Logstash
- pipeline.id: aws_logstash
path.config: "/etc/logstash/aws_logstash/*.conf"
145
- pipeline.id: aws_filebeat
path.config: "/etc/logstash/aws_filebeat/*.conf"
- pipeline.id: aws_opsgenie
path.config: "/etc/logstash/aws_opsgenie/*.conf"
- pipeline.id: aws_nginx
path.config: "/etc/logstash/aws_nginx/*.conf"
Установка Curator для автоматического удаления логов по
расписанию
---
- include: setup-RedHat.yml
when: ansible_os_family == 'RedHat'
- include: setup-Debian.yml
when: ansible_os_family == 'Debian'
- name: Install Elasticsearch Curator and required dependencies.
pip:
name:
- elasticsearch-curator
- argparse
- name: Creates directory aws_opsgenie
file:
path: /var/log/curator_logs/
state: directory
owner: logstash
group: logstash
mode: 0775
- name: Configure cron jobs for Elasticsearch Curator.
cron:
name: "{{ item.name }}"
job: "{{ item.job }}"
minute: "{{ item.minute | default('*') }}"
hour: "{{ item.hour | default('*') }}"
day: "{{ item.day | default('*') }}"
weekday: "{{ item.weekday | default('*') }}"
month: "{{ item.month | default('*') }}"
with_items: "{{ elasticsearch_curator_cron_jobs }}"
- name: Create directory curator
file:
path: /etc/curator/
state: directory
owner: logstash
group: logstash
mode: 0775
- name: Creates Logs directory curator
file:
path: /var/log/curator_logs/
state: directory
Источник: https://baza.diplomsite.ru/previewfile/1758