initial commit

This commit is contained in:
Diogenes Pelisson 2020-04-19 17:28:06 -03:00
commit fba33111d7
11 changed files with 305 additions and 0 deletions

13
LICENSE Normal file
View File

@ -0,0 +1,13 @@
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) 2004 Diogenes Pelisson <diogenes.pelisson@gmail.com>
Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.

33
README.md Normal file
View File

@ -0,0 +1,33 @@
Role Name
=========
Deploy and configure [Loki/Promtail](https://github.com/grafana/loki) using Ansible.
Requirements
------------
- Ansible >= 2.9
Role Variables
--------------
A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well.
Example Playbook
----------------
Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too:
- hosts: servers
roles:
- { role: username.rolename, x: 42 }
License
-------
WTFPL see [LICENSE](license)
Author Information
------------------
An optional section for the role authors to include contact information, or a website (HTML is not allowed).

36
defaults/main.yml Normal file
View File

@ -0,0 +1,36 @@
---
# loki version to install
loki_version: 'latest'
# loki bins to install
loki_bins:
- loki
- logcli
- promtail
loki_user: loki
loki_group: loki
loki_config_dir: /etc/loki
loki_binary_local_dir: ''
loki_target: all
loki_auth_enabled: true
loki_server_config:
http_listen_address: 0.0.0.0
http_listen_port: 80
grpc_listen_address: 0.0.0.0
grpc_listen_port: 9095
loki_distributor_config: []
loki_querier_config: []
loki_ingester_client_config: []
loki_ingester_config: []
loki_storage_config: []
loki_chunk_store_config: []
loki_schema_config: []
loki_limits_config: []
loki_frontend_worker_config: []
loki_table_manager_config: []
loki_runtime_config: []

13
handlers/main.yml Normal file
View File

@ -0,0 +1,13 @@
---
- name: restart loki
become: true
systemd:
daemon_reload: true
name: loki
state: restarted
- name: reload loki
become: true
systemd:
name: loki
state: reloaded

25
meta/main.yml Normal file
View File

@ -0,0 +1,25 @@
galaxy_info:
author: Diogenes Pelisson
description: Deploy and configure Loki and Promtail.
company: none
issue_tracker_url: https://github.com/diogenxs/ansible-role-loki/issues
license: WTFPL
min_ansible_version: 2.9
platforms:
- name: Ubuntu
versions:
- bionic
- xenial
- name: Debian
versions:
- stretch
- buster
galaxy_tags:
- loki
- promtail
- logging
- collector
- monitoring
- grafana
- prometheus
dependencies: []

80
tasks/install.yml Normal file
View File

@ -0,0 +1,80 @@
---
- name: create {{ loki_group }} system group
group:
name: "{{ loki_group }}"
system: true
state: present
- name: create {{ loki_user }} system user
user:
name: "{{ loki_user }}"
system: true
shell: "/usr/sbin/nologin"
group: "{{ loki_group }}"
createhome: false
# home: "{{ loki_db_dir }}"
# - name: create loki data directory
# file:
# path: "{{ loki_db_dir }}"
# state: directory
# owner: loki
# group: loki
# mode: 0755
- name: create loki configuration directories
file:
path: "{{ item }}"
state: directory
owner: root
group: "{{ loki_group }}"
mode: 0770
with_items:
- "{{ loki_config_dir }}"
- block:
- name: download binaries to local folder
become: false
get_url:
url: "https://github.com/grafana/loki/releases/download/v{{ loki_version }}/{{ item }}-linux-{{ go_arch }}.zip"
dest: "/tmp/{{ item }}-{{ loki_version }}-linux-{{ go_arch }}.zip"
checksum: "sha256:{{ __loki_bins_checksum[item] }}"
register: _download_archive
until: _download_archive is succeeded
retries: 5
delay: 2
loop: "{{ loki_bins }}"
- name: unpack binaries
become: false
unarchive:
src: "/tmp/{{ item }}-{{ loki_version }}-linux-{{ go_arch }}.zip"
dest: "/tmp"
creates: "/tmp/{{ item }}-{{ loki_version }}-linux-{{ go_arch }}"
loop: "{{ loki_bins }}"
- name: propagate official binaries
copy:
src: "/tmp/{{ item }}-linux-{{ go_arch }}"
dest: "/usr/local/bin/{{ item }}"
mode: 0755
owner: root
group: root
loop: "{{ loki_bins }}"
notify:
- restart loki
- name: create systemd service unit
template:
src: loki.service.j2
dest: /etc/systemd/system/loki.service
owner: root
group: root
mode: 0644
notify:
- restart loki
loop: "{{ loki_bins }}"
when:
- item == 'loki' or
- item == 'loki-canary' or
- item == 'promtail'

5
tasks/main.yml Normal file
View File

@ -0,0 +1,5 @@
---
- include: preflight.yml
- include: install.yml
become: true

44
tasks/preflight.yml Normal file
View File

@ -0,0 +1,44 @@
---
# - name: Assert usage of systemd as an init system
# assert:
# that: ansible_service_mgr == 'systemd'
# msg: "This module only works with systemd"
- block:
- name: Get latest release
uri:
url: "https://api.github.com/repos/grafana/loki/releases/latest"
method: GET
return_content: true
status_code: 200
body_format: json
validate_certs: false
user: "{{ lookup('env', 'GH_USER') | default(omit) }}"
password: "{{ lookup('env', 'GH_TOKEN') | default(omit) }}"
no_log: "{{ not lookup('env', 'ANSIBLE_DEBUG') | bool }}"
register: _latest_release
until: _latest_release.status == 200
retries: 5
- name: "Set loki version to {{ _latest_release.json.tag_name[1:] }}"
set_fact:
loki_version: "{{ _latest_release.json.tag_name[1:] }}"
when:
- loki_version == "latest"
- loki_binary_local_dir | length == 0
- block:
- name: "Get checksum list"
set_fact:
__loki_checksums: "{{ lookup('url', 'https://github.com/grafana/loki/releases/download/v' + loki_version + '/SHA256SUMS', wantlist=True) | list }}"
run_once: true
- name: "Get checksum for {{ item[1] }} in {{ go_arch }} architecture"
set_fact:
__loki_bins_checksum: "{{ __loki_bins_checksum | default({}) | combine({item[1]: item[0].split()[0]}) }}"
loop: "{{ lookup('nested', __loki_checksums, loki_bins, wantlist=True) }}"
when:
- "(item[1] + '-linux-' + go_arch + '.zip') in item[0].split()[1]"
delegate_to: localhost
when:
- loki_binary_local_dir | length == 0

View File

47
templates/loki.yml.j2 Normal file
View File

@ -0,0 +1,47 @@
#jinja2: trim_blocks: True, lstrip_blocks: True
{{ ansible_managed | comment }}
# https://github.com/grafana/loki/blob/master/docs/configuration/README.md#configuration-file-reference
{% if loki_target != "" %}
target: {{ loki_target }}
{% endif %}}
{% if loki_auth_enabled %}
auth_enabled: {{ loki_auth_enabled }}
{% endif %}}
{% if loki_server_config != [] %}
server: {{ loki_server_config }}
{% endif %}}
{% if loki_distributor_config != [] %}
distributor: {{ loki_distributor_config }}
{% endif %}}
{% if loki_querier_config != [] %}
querier: {{ loki_querier_config }}
{% endif %}}
{% if loki_ingester_client_config != [] %}
ingester_client: {{ loki_ingester_client_config }}
{% endif %}}
{% if loki_ingester_config != [] %}
ingester: {{ loki_ingester_config }}
{% endif %}}
{% if loki_storage_config != [] %}
storage_config: {{ loki_storage_config }}
{% endif %}}
{% if loki_chunk_store_config != [] %}
chunk_store_config: {{ loki_chunk_store_config }}
{% endif %}}
{% if loki_schema_config != [] %}
schema_config: {{ loki_schema_config }}
{% endif %}}
{% if loki_limits_config != [] %}
limits_config: {{ loki_limits_config }}
{% endif %}}
{% if loki_frontend_worker_config != [] %}
frontend_worker_config: {{ loki_frontend_worker_config }}
{% endif %}}
{% if loki_table_manager_config != [] %}
table_manager_config: {{ loki_table_manager_config }}
{% endif %}}
{% if loki_runtime_config != [] %}
runtime_config: {{ loki_runtime_config }}
{% endif %}}

9
vars/main.yml Normal file
View File

@ -0,0 +1,9 @@
---
go_arch_map:
i386: '386'
x86_64: 'amd64'
aarch64: 'arm64'
armv7l: 'armv7'
armv6l: 'armv6'
go_arch: "{{ go_arch_map[ansible_architecture] | default(ansible_architecture) }}"