feat: Create role
This commit is contained in:
parent
079950f42f
commit
6746be0753
@ -1,3 +1,3 @@
|
||||
# role_modele
|
||||
# role_hcio
|
||||
|
||||
Modèle
|
||||
Deploy checks sent to a [healthchecks.io](https://healthchecks.io/) server.
|
||||
|
24
defaults/main.yml
Normal file
24
defaults/main.yml
Normal file
@ -0,0 +1,24 @@
|
||||
---
|
||||
# defaults file for hcio
|
||||
|
||||
# Path to store checks UUID
|
||||
hcio_local_facts_file: /etc/ansible/facts.d/hcio.fact
|
||||
|
||||
# Pat to store scripts
|
||||
hcio_path: /srv/healthchecksio
|
||||
|
||||
# Informations about hcio server
|
||||
hcio_url: ""
|
||||
hcio_api_key: ""
|
||||
|
||||
# Add prefix on slug
|
||||
hcio_slug_prefix: "{{ inventory_hostname | replace('.', '_') }}-"
|
||||
|
||||
# Define checks
|
||||
hcio_checks: []
|
||||
# Example :
|
||||
# - name: "{{ inventory_hostname }}"
|
||||
# tags: "{{ group_names }}"
|
||||
# timeout: 300
|
||||
# channels: "{{ hcio_host_channels }}"
|
||||
# target: host
|
35
handlers/main.yml
Normal file
35
handlers/main.yml
Normal file
@ -0,0 +1,35 @@
|
||||
---
|
||||
# handlers file for hcio
|
||||
|
||||
- name: Write UUID in local facts
|
||||
community.general.ini_file:
|
||||
path: "{{ hcio_local_facts_file }}"
|
||||
section: role_hcio
|
||||
option: "{{ item.json.slug | replace(hcio_slug_prefix, '') }}"
|
||||
value: "{{ item.json.ping_url.split('/') | last }}"
|
||||
create: false
|
||||
when: item.changed
|
||||
become: true
|
||||
loop: "{{ created.results }}"
|
||||
loop_control:
|
||||
label: "{{ item.get('json', {}).get('slug', '') }}"
|
||||
|
||||
- name: Reload local facts
|
||||
ansible.builtin.setup:
|
||||
filter: ansible_local
|
||||
|
||||
- name: Enable timer
|
||||
ansible.builtin.systemd:
|
||||
name: "{{ filename }}.timer"
|
||||
state: started
|
||||
enabled: true
|
||||
daemon_reload: true
|
||||
become: true
|
||||
|
||||
- name: Start service
|
||||
ansible.builtin.systemd:
|
||||
name: "{{ filename }}.service"
|
||||
state: started
|
||||
enabled: false
|
||||
daemon_reload: true
|
||||
become: true
|
@ -1,7 +1,7 @@
|
||||
galaxy_info:
|
||||
namespace: ykn
|
||||
author: pulsar89.5
|
||||
description: Rôle modèle
|
||||
description: Deploy checks sent to a healthchecks.io server
|
||||
|
||||
license: GPL-3.0-or-later
|
||||
|
||||
|
135
tasks/checks.yml
Normal file
135
tasks/checks.yml
Normal file
@ -0,0 +1,135 @@
|
||||
---
|
||||
# tasks file for hcio
|
||||
|
||||
- name: Create checks on the server
|
||||
ansible.builtin.uri:
|
||||
status_code: [200, 201]
|
||||
method: POST
|
||||
url: "{{ hcio_url }}/api/v3/checks/"
|
||||
headers:
|
||||
X-Api-Key: "{{ hcio_api_key }}"
|
||||
body_format: json
|
||||
body: >
|
||||
{
|
||||
"name": "{{ item.name }}",
|
||||
"slug": "{{ hcio_slug_prefix }}{{ item.slug }}",
|
||||
"tags": "{{ item.tags | join(' ') }}",
|
||||
"timeout": {{ timeout }},
|
||||
"grace": {{ item.grace if item.grace is defined else grace }},
|
||||
"channels": "{{ channels }}",
|
||||
"unique": ["name"]
|
||||
}
|
||||
when: uuid | length <= 0
|
||||
changed_when: true
|
||||
register: created
|
||||
loop: "{{ hcio_checks }}"
|
||||
loop_control:
|
||||
label: "{{ item.name }}"
|
||||
notify:
|
||||
- Write UUID in local facts
|
||||
- Reload local facts
|
||||
vars:
|
||||
timeout: "{{ (item.timeout | int) + 30 }}"
|
||||
grace: "{{ (item.timeout | int) * 3 }}"
|
||||
channels: "{{ item.channels | join(',') }}"
|
||||
uuid: "{{ ansible_local.get('chaos', {}).get('role_hcio', {}).get(item.slug, {}) }}"
|
||||
|
||||
- name: Flush handlers
|
||||
ansible.builtin.meta: flush_handlers
|
||||
|
||||
- name: Update checks on the server
|
||||
ansible.builtin.uri:
|
||||
status_code: [200, 201]
|
||||
method: POST
|
||||
url: "{{ hcio_url }}/api/v3/checks/{{ uuid }}"
|
||||
headers:
|
||||
X-Api-Key: "{{ hcio_api_key }}"
|
||||
body_format: json
|
||||
body: >
|
||||
{
|
||||
"slug": "{{ hcio_slug_prefix }}{{ item.slug }}",
|
||||
"tags": "{{ item.tags | join(' ') }}",
|
||||
"timeout": {{ timeout }},
|
||||
"grace": {{ item.grace if item.grace is defined else grace }},
|
||||
"channels": "{{ channels }}",
|
||||
}
|
||||
when: uuid | length > 0
|
||||
loop: "{{ hcio_checks }}"
|
||||
loop_control:
|
||||
label: "{{ item.name }}"
|
||||
vars:
|
||||
timeout: "{{ (item.timeout | int) + 30 }}"
|
||||
grace: "{{ (item.timeout | int) * 3 }}"
|
||||
channels: "{{ item.channels | join(',') }}"
|
||||
uuid: "{{ ansible_local.get('chaos', {}).get('role_hcio', {}).get(item.slug, {}) }}"
|
||||
|
||||
- name: Deploy scripts from this role
|
||||
ansible.builtin.copy:
|
||||
src: "{{ item }}"
|
||||
dest: "{{ hcio_path }}/{{ filename }}"
|
||||
owner: root
|
||||
group: root
|
||||
mode: u=rwx,g=rx,o=rx
|
||||
become: true
|
||||
loop: "{{ lookup('ansible.builtin.fileglob', path + '/*.j2', wantlist=True) }}"
|
||||
vars:
|
||||
path: "{{ role_path }}/templates/scripts"
|
||||
filename: "{{ item | basename | replace('.j2', '') }}"
|
||||
|
||||
- name: Deploy scripts from playbook
|
||||
ansible.builtin.copy:
|
||||
src: "{{ item }}"
|
||||
dest: "{{ hcio_path }}/{{ filename }}"
|
||||
owner: root
|
||||
group: root
|
||||
mode: u=rwx,g=rx,o=rx
|
||||
become: true
|
||||
loop: "{{ lookup('ansible.builtin.fileglob', path + '/*.j2', wantlist=True) }}"
|
||||
vars:
|
||||
path: "{{ playbook_dir }}/templates/role_hcio"
|
||||
filename: "{{ item | basename | replace('.j2', '') }}"
|
||||
|
||||
- name: Deploy checks on the instance
|
||||
ansible.builtin.template:
|
||||
owner: root
|
||||
group: root
|
||||
mode: u=rw,g=r,o=r
|
||||
src: service.j2
|
||||
dest: /etc/systemd/system/{{ filename }}.service
|
||||
when: item.cmd is defined
|
||||
become: true
|
||||
loop: "{{ hcio_checks }}"
|
||||
loop_control:
|
||||
label: "{{ item.name }}"
|
||||
vars:
|
||||
filename: "hcio@{{ item.slug }}"
|
||||
uuid: "{{ ansible_local.get('chaos', {}).get('role_hcio', {}).get(item.slug, {}) }}"
|
||||
|
||||
- name: Deploy schedules on the instance
|
||||
ansible.builtin.template:
|
||||
owner: root
|
||||
group: root
|
||||
mode: u=rw,g=r,o=r
|
||||
src: timer.j2
|
||||
dest: /etc/systemd/system/{{ filename }}.timer
|
||||
when: item.cmd is defined
|
||||
become: true
|
||||
loop: "{{ hcio_checks }}"
|
||||
loop_control:
|
||||
label: "{{ item.name }}"
|
||||
vars:
|
||||
filename: "hcio@{{ item.slug }}"
|
||||
|
||||
- name: Enable schedules
|
||||
ansible.builtin.systemd:
|
||||
enabled: true
|
||||
daemon_reload: true
|
||||
state: started
|
||||
name: "{{ filename }}.timer"
|
||||
when: item.cmd is defined
|
||||
become: true
|
||||
loop: "{{ hcio_checks }}"
|
||||
loop_control:
|
||||
label: "{{ item.name }}"
|
||||
vars:
|
||||
filename: "hcio@{{ item.slug }}"
|
29
tasks/main.yml
Normal file
29
tasks/main.yml
Normal file
@ -0,0 +1,29 @@
|
||||
---
|
||||
# tasks file for hcio
|
||||
|
||||
- name: Install prerequisites
|
||||
ansible.builtin.apt:
|
||||
name: "{{ hcio_prerequisites }}"
|
||||
become: true
|
||||
|
||||
- name: Create directory to store scripts
|
||||
ansible.builtin.file:
|
||||
path: "{{ hcio_path }}"
|
||||
state: directory
|
||||
owner: root
|
||||
group: root
|
||||
mode: u=rwX,g=rX,o=
|
||||
become: true
|
||||
|
||||
- name: Build the checks list
|
||||
ansible.builtin.set_fact:
|
||||
hcio_checks: "{{ hcio_checks + specific }}"
|
||||
when: specific | length > 0
|
||||
loop: "{{ lookup('ansible.builtin.varnames', '^hcio_checks_.+', wantlist=True) }}"
|
||||
vars:
|
||||
specific: "{{ lookup('ansible.builtin.vars', item, default='') }}"
|
||||
|
||||
- name: Import checks deployment tasks
|
||||
ansible.builtin.include_tasks:
|
||||
file: checks.yml
|
||||
when: hcio_checks | length > 0
|
12
templates/scripts/disk.bash.j2
Normal file
12
templates/scripts/disk.bash.j2
Normal file
@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
# {{ ansible_managed }}
|
||||
|
||||
# Get disk usage in percent
|
||||
pct=$(df --output=pcent $1 | tail -n 1 | tr -d '% ')
|
||||
|
||||
# Fail if disk is used more than limit
|
||||
if [ $pct -gt $2 ]; then
|
||||
/usr/bin/curl -s --retry 5 -o /dev/null "${3}/fail"
|
||||
else
|
||||
/usr/bin/curl -s --retry 5 -o /dev/null "${3}"
|
||||
fi
|
12
templates/service.j2
Normal file
12
templates/service.j2
Normal file
@ -0,0 +1,12 @@
|
||||
# {{ ansible_managed }}
|
||||
|
||||
[Unit]
|
||||
Description={{ item.name }}
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart={{ item.cmd }} "{{ hcio_url }}/ping/{{ uuid }}"
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
18
templates/service.j2.backup
Normal file
18
templates/service.j2.backup
Normal file
@ -0,0 +1,18 @@
|
||||
# {{ ansible_managed }}
|
||||
|
||||
[Unit]
|
||||
Description={{ item.name }}
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
{% if item.cmd is defined %}
|
||||
ExecStart={{ item.cmd }} && /usr/bin/curl -s --retry 5 -o /dev/null {{ hcio_url }}/ping/{{ uuid }}
|
||||
{% elif item.script is defined %}
|
||||
ExecStart={{ hcio_path }}/scripts/{{ item.script | basename }} "{{ hcio_url }}/ping/{{ uuid }}"
|
||||
{% else %}
|
||||
ExecStart=/usr/bin/curl -s --retry 5 -o /dev/null {{ hcio_url }}/ping/{{ uuid }}
|
||||
{% endif %}
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
12
templates/timer.j2
Normal file
12
templates/timer.j2
Normal file
@ -0,0 +1,12 @@
|
||||
# {{ ansible_managed }}
|
||||
|
||||
[Unit]
|
||||
Description={{ item.name }}
|
||||
|
||||
[Timer]
|
||||
OnBootSec={{ (item.timeout | int) - 10 }}second
|
||||
OnUnitActiveSec={{ (item.timeout | int) - 10 }}second
|
||||
Persistent=true
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
5
vars/main.yml
Normal file
5
vars/main.yml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
# vars file for hcio
|
||||
|
||||
hcio_prerequisites:
|
||||
- curl
|
Loading…
x
Reference in New Issue
Block a user