Author SHA1 Message Date
mirsal 0cedc82d83 roles: dns-internal: nsd: Update IP addresses for zola.vinishor.xyz
the zola.vinishor.xyz secondary has seemingly changed IP addresses
2026-06-18 09:54:59 +00:00
mirsal e3e4179f92 Temporarily remove lolix-ixpman.labolyon.dn42 2026-06-14 16:34:04 +00:00
mirsal d699fd578c roles: prometheus: templates: scrape-main: remove useless systemd labels
Remove unused high-cardinality node_systemd_unit_state labels
2026-06-14 16:17:05 +00:00
mirsal 151972611f ansible: roles: prometheus: Add send e-mail alerts to vinishor 2026-06-14 13:48:56 +00:00
mirsal e1ca88e56d roles: prometheus: alertmanager: Notify mirsal@labolyon.fr
* Send alert notification to mirsal@labolyon.fr
 * Send resolved notifications
2026-06-13 19:27:34 +00:00
vincent f8319b7fe1 Merge pull request 'Add grafana configuration and set up e-mail' (#4) from grafana-config into main
Reviewed-on: #4
2026-06-13 19:15:13 +02:00
vincent 99f7e6e8e0 Merge pull request 'Configure e-mails alerts sent by prometheus-alertmanager' (#3) from prometheus-email into main
Reviewed-on: #3
2026-06-13 19:14:48 +02:00
vincent 6e5c222116 Merge pull request 'Rework blackbox monitoring' (#2) from rework-blackbox-monitoring into main
Reviewed-on: #2
2026-06-13 19:07:13 +02:00
mirsal 71b8ae618d roles: grafana: Add grafana configuration 2026-06-13 16:05:14 +00:00
mirsal eabaff50f7 roles: grafana: tasks: main.yml Switch from CRLF to LF 2026-06-13 16:00:46 +00:00
mirsal be3b09ef66 roles: prometheus: Add alertmanager configuration 2026-06-13 15:17:10 +00:00
mirsal 600912cc95 roles: prometheus: tasks: main.yml: Switch from CRLF to LF 2026-06-13 15:11:18 +00:00
mirsal 18852dbc2f roles: prometheus: scrape-blackbox: Monitor webmail.labolyon.fr 2026-06-12 07:42:37 +00:00
mirsal 006f174778 roles: blackbox-exporter: templates: blackbox.config.j2: switch to LF 2026-06-12 07:33:21 +00:00
mirsal 43c7959d85 Rework prometheus blackbox monitoring configuration
* Use scrape_config_files correctly
 * Do not separate prometheus and blackbox exporter nodes
 * Add a http_2xx_selfsigned module for self-signed certs
 * Monitor missing services
 * Switch from CRLF to LF in prometheus.config.j2
2026-06-12 07:27:30 +00:00
vincent daca460fdd inventory: add octoprint server 2026-06-09 15:32:40 +02:00
vincent 47b1067cb4 Ajout de sudo en passwordless 2026-06-09 10:53:43 +02:00
vincent 6615aeff55 Retrait des vieux paquets 2026-06-09 10:53:26 +02:00
vincent 46d14d6ac1 Maj de la config Prometheus 2026-06-09 10:53:17 +02:00
vincent 1d67e6a18f Suppression des fichiers var inutiles 2026-06-09 10:52:58 +02:00
vincent c1ca38a42a Refactoring de l'inventaire 2026-06-09 10:52:35 +02:00
vincent 05b5c63fe5 Merge pull request 'nsd.conf: Set up ns1.1312.zone as secondary for labolyon.fr' (#1) from dns-secondaire-mirsal into main
Reviewed-on: #1
2025-07-29 21:10:38 +02:00
19 changed files with 2263 additions and 269 deletions
+18 -16
View File
@@ -2,24 +2,26 @@ all:
children: children:
debian: debian:
hosts: hosts:
reverse-proxy.labolyon.dn42:
git.labolyon.dn42:
labolyon-fr.labolyon.dn42:
matrix.labolyon.dn42:
wiki.labolyon.dn42:
blogs.labolyon.dn42:
mail.labolyon.dn42:
radius.labolyon.dn42:
ansible.labolyon.dn42: ansible.labolyon.dn42:
blogs.labolyon.dn42:
dn42-router.labolyon.dn42: dn42-router.labolyon.dn42:
lolix-rs1.labolyon.dn42:
lolix-ixpman.labolyon.dn42:
dns.labolyon.dn42: dns.labolyon.dn42:
mosquitto.labolyon.dn42: git.labolyon.dn42:
monitoring.labolyon.dn42: i2p.labolyon.dn42:
labolyon-fr.labolyon.dn42:
# lolix-ixpman.labolyon.dn42:
lolix-rs1.labolyon.dn42:
lolmox.labolyon.dn42: lolmox.labolyon.dn42:
lolmox2.labolyon.dn42: lolmox2.labolyon.dn42:
i2p.labolyon.dn42: mail.labolyon.dn42:
# blackbox: matrix.labolyon.dn42:
# hosts: monitoring.labolyon.dn42:
# monitoring: mosquitto.labolyon.dn42:
octoprint.labolyon.dn42:
radius.labolyon.dn42:
reverse-proxy.labolyon.dn42:
wiki.labolyon.dn42:
zigbee2mqtt.labolyon.dn42:
monitoring:
hosts:
monitoring.labolyon.dn42:
+2 -12
View File
@@ -12,21 +12,11 @@
become: yes become: yes
roles: roles:
- prometheus - prometheus
- blackbox-exporter
vars: vars:
blackbox: false
scrape_files: scrape_files:
- /etc/prometheus/scrape-main.yml - /etc/prometheus/scrape-main.yml
- /etc/prometheus/scrape-blackbox.yml
#- name: Install and configure Prometheus node - Blackbox nodes
# hosts: blackbox
# become: yes
# roles:
# - prometheus
# - blackbox-exporter
# vars:
# blackbox: true
# scrape_files:
# - /etc/prometheus/scrape-blackbox.yml
- name: Install and configure nodes - name: Install and configure nodes
hosts: all hosts: all
@@ -1,60 +1,65 @@
{{ ansible_managed | comment }} {{ ansible_managed | comment }}
modules: modules:
http_2xx: http_2xx:
prober: http prober: http
{% if inventory_hostname == 'check.home.arpa' %} {% if inventory_hostname == 'check.home.arpa' %}
http: http:
preferred_ip_protocol: "ip4" preferred_ip_protocol: "ip4"
ip_protocol_fallback: true ip_protocol_fallback: true
{% endif %} {% endif %}
http_post_2xx: http_2xx_selfsigned:
prober: http prober: http
{% if inventory_hostname == 'check.home.arpa' %} http:
http: tls_config:
method: POST insecure_skip_verify: true
preferred_ip_protocol: "ip4" http_post_2xx:
ip_protocol_fallback: true prober: http
{% endif %} {% if inventory_hostname == 'check.home.arpa' %}
tcp_connect: http:
prober: tcp method: POST
smtp_check: preferred_ip_protocol: "ip4"
prober: tcp ip_protocol_fallback: true
timeout: 5s {% endif %}
tcp: tcp_connect:
{% if inventory_hostname == 'check.home.arpa' %} prober: tcp
preferred_ip_protocol: "ip4" smtp_check:
ip_protocol_fallback: true prober: tcp
{% endif %} timeout: 5s
query_response: tcp:
- expect: "^220(.*)ESMTP(.*)$" {% if inventory_hostname == 'check.home.arpa' %}
- send: "EHLO prober\r" preferred_ip_protocol: "ip4"
- expect: "^250-STARTTLS" ip_protocol_fallback: true
- send: "STARTTLS\r" {% endif %}
- expect: "^220" query_response:
- starttls: true - expect: "^220(.*)ESMTP(.*)$"
- send: "EHLO prober\r" - send: "EHLO prober\r"
- expect: "^250-AUTH" - expect: "^250-STARTTLS"
- send: "QUIT\r" - send: "STARTTLS\r"
imap_check: - expect: "^220"
prober: tcp - starttls: true
timeout: 5s - send: "EHLO prober\r"
tcp: - expect: "^250-AUTH"
{% if inventory_hostname == 'check.home.arpa' %} - send: "QUIT\r"
preferred_ip_protocol: "ip4" imap_check:
ip_protocol_fallback: true prober: tcp
{% endif %} timeout: 5s
query_response: tcp:
- expect: "OK.*STARTTLS" {% if inventory_hostname == 'check.home.arpa' %}
- send: ". STARTTLS" preferred_ip_protocol: "ip4"
- expect: "OK" ip_protocol_fallback: true
- starttls: true {% endif %}
- send: ". capability" query_response:
- expect: "CAPABILITY IMAP4rev1" - expect: "OK.*STARTTLS"
icmp: - send: ". STARTTLS"
prober: icmp - expect: "OK"
{% if inventory_hostname == 'check.home.arpa' %} - starttls: true
icmp: - send: ". capability"
preferred_ip_protocol: "ip4" - expect: "CAPABILITY IMAP4rev1"
ip_protocol_fallback: true icmp:
{% endif %} prober: icmp
{% if inventory_hostname == 'check.home.arpa' %}
icmp:
preferred_ip_protocol: "ip4"
ip_protocol_fallback: true
{% endif %}
@@ -31,10 +31,10 @@ zone:
name: "labolyon.fr" name: "labolyon.fr"
zonefile: "labolyon.fr.zone" zonefile: "labolyon.fr.zone"
## zola.vinishor.xyz ## zola.vinishor.xyz
notify: 2a0e:e701:11e7:cafe:3737::1 clesecrete notify: 2001:41d0:fc32:d710:3737::1 clesecrete
provide-xfr: 2a0e:e701:11e7:cafe:3737::1 clesecrete provide-xfr: 2001:41d0:fc32:d710:3737::1 clesecrete
notify: 45.13.105.181 clesecrete notify: 109.190.187.14 clesecrete
provide-xfr: 45.13.105.181 clesecrete provide-xfr: 109.190.187.14 clesecrete
## ns1.1312.zone ## ns1.1312.zone
notify: 2a03:b0c0:2:d0::12f0:4001 dns_labolyon_fr_to_ns1_1312_zone notify: 2a03:b0c0:2:d0::12f0:4001 dns_labolyon_fr_to_ns1_1312_zone
provide-xfr: 2a03:b0c0:2:d0::12f0:4001 dns_labolyon_fr_to_ns1_1312_zone provide-xfr: 2a03:b0c0:2:d0::12f0:4001 dns_labolyon_fr_to_ns1_1312_zone
+5
View File
@@ -0,0 +1,5 @@
## Restart grafana on changes
- name: restart grafana
ansible.builtin.service:
name: 'grafana-server'
state: restarted
+21 -14
View File
@@ -1,14 +1,21 @@
--- ---
- name: Install Grafana - name: Install Grafana
tags: grafana-install tags: grafana-install
ansible.builtin.package: ansible.builtin.package:
name: 'grafana' name: 'grafana'
state: latest state: latest
- name: Enable Grafana service - name: Add grafana configuration
tags: grafana-enable tags: grafana-configure
ansible.builtin.service: ansible.builtin.template:
name: 'grafana-server' src: grafana.ini.j2
state: started dest: '/etc/grafana/grafana.ini'
enabled: yes notify: restart grafana
- name: Enable Grafana service
tags: grafana-enable
ansible.builtin.service:
name: 'grafana-server'
state: started
enabled: yes
File diff suppressed because it is too large Load Diff
@@ -1,6 +0,0 @@
---
# vars file for node-exporter role
node_service: node-exporter
node_package:
- prometheus-node-exporter
@@ -1,6 +0,0 @@
---
# vars file for node-exporter role
node_service: prometheus-node-exporter
node_package:
- golang-github-prometheus-node-exporter
@@ -1,6 +0,0 @@
---
# vars file for node-exporter role
node_service: prometheus-node_exporter
node_package:
- golang-github-prometheus-node_exporter
+70 -62
View File
@@ -1,62 +1,70 @@
--- ---
- name: Load variables - name: Load variables
include_vars: "{{ ansible_os_family|lower }}.yml" include_vars: "{{ ansible_os_family|lower }}.yml"
- name: Install Prometheus - name: Install Prometheus
tags: prometheus-install tags: prometheus-install
ansible.builtin.package: ansible.builtin.package:
name: '{{ prometheus_package }}' name: '{{ prometheus_package }}'
state: latest state: latest
- name: Add scrape configuration - name: Add scrape configuration
tags: prometheus-scrape-configure tags: prometheus-scrape-configure
ansible.builtin.copy: ansible.builtin.copy:
src: "{{ item.src }}" src: "{{ item.src }}"
dest: "/etc/prometheus/{{ item.dest }}" dest: "/etc/prometheus/{{ item.dest }}"
loop: loop:
- { src: '../templates/scrape-main.yml', dest: 'scrape-main.yml' } - { src: '../templates/scrape-main.yml', dest: 'scrape-main.yml' }
- { src: '../templates/scrape-blackbox.yml', dest: 'scrape-blackbox.yml' } - { src: '../templates/scrape-blackbox.yml', dest: 'scrape-blackbox.yml' }
notify: notify:
- restart prometheus - restart prometheus
- name: Create folder for rules definition - name: Add alertmanager configuration
ansible.builtin.file: tags: alertmanager-configure
path: /etc/prometheus/rules ansible.builtin.template:
state: directory src: alertmanager.yml.j2
mode: 0755 dest: '{{ alertmanager_config }}'
notify:
- name: Add rules configuration - restart alertmanager
tags: alertmanager-rules-configure
ansible.builtin.copy: - name: Create folder for rules definition
src: "{{ item.src }}" ansible.builtin.file:
dest: "{{ alertmanager_rules }}/{{ item.dest }}" path: /etc/prometheus/rules
loop: state: directory
- { src: '../templates/hosts.rules', dest: 'hosts.rules.yml' } mode: 0755
- { src: '../templates/prometheus.rules', dest: 'prometheus.rules.yml' }
- { src: '../templates/blackbox.rules', dest: 'blackbox.rules.yml' } - name: Add rules configuration
notify: tags: alertmanager-rules-configure
- restart prometheus ansible.builtin.copy:
- restart alertmanager src: "{{ item.src }}"
dest: "{{ alertmanager_rules }}/{{ item.dest }}"
- name: Enable Prometheus configuration loop:
tags: prometheus-configure - { src: '../templates/hosts.rules', dest: 'hosts.rules.yml' }
ansible.builtin.template: - { src: '../templates/prometheus.rules', dest: 'prometheus.rules.yml' }
src: prometheus.config.j2 - { src: '../templates/blackbox.rules', dest: 'blackbox.rules.yml' }
dest: '{{ prometheus_config }}' notify:
validate: promtool check config %s - restart prometheus
notify: restart prometheus - restart alertmanager
- name: Enable Prometheus service - name: Enable Prometheus configuration
tags: prometheus-enable tags: prometheus-configure
ansible.builtin.service: ansible.builtin.template:
name: '{{ prometheus_service }}' src: prometheus.config.j2
state: started dest: '{{ prometheus_config }}'
enabled: yes validate: promtool check config %s
notify: restart prometheus
- name: Enable Alertmanager service
tags: alertmanager-enable - name: Enable Prometheus service
ansible.builtin.service: tags: prometheus-enable
name: '{{ alertmanager_service }}' ansible.builtin.service:
state: started name: '{{ prometheus_service }}'
enabled: yes state: started
enabled: yes
- name: Enable Alertmanager service
tags: alertmanager-enable
ansible.builtin.service:
name: '{{ alertmanager_service }}'
state: started
enabled: yes
@@ -0,0 +1,67 @@
{{ ansible_managed | comment }}
# See https://prometheus.io/docs/alerting/configuration/ for documentation.
global:
# The smarthost and SMTP sender used for mail notifications.
smtp_smarthost: 'mail.labolyon.fr:587'
smtp_from: 'alerts@labolyon.fr'
smtp_auth_username: 'alerts@labolyon.fr'
smtp_auth_password: {{ lookup('community.general.passwordstore', 'monitoring/e-mail/alerts@labolyon.fr')}}
# The directory from which notification templates are read.
templates:
- '/etc/prometheus/alertmanager_templates/*.tmpl'
# The root route on which each incoming alert enters.
route:
# The labels by which incoming alerts are grouped together. For example,
# multiple alerts coming in for cluster=A and alertname=LatencyHigh would
# be batched into a single group.
#
# To aggregate by all possible labels use '...' as the sole label name.
# This effectively disables aggregation entirely, passing through all
# alerts as-is. This is unlikely to be what you want, unless you have
# a very low alert volume or your upstream notification system performs
# its own grouping. Example: group_by: [...]
group_by: ['alertname', 'cluster', 'service']
# When a new group of alerts is created by an incoming alert, wait at
# least 'group_wait' to send the initial notification.
# This way ensures that you get multiple alerts for the same group that start
# firing shortly after another are batched together on the first
# notification.
group_wait: 30s
# When the first notification was sent, wait 'group_interval' to send a batch
# of new alerts that started firing for that group.
group_interval: 5m
# If an alert has successfully been sent, wait 'repeat_interval' to
# resend them.
repeat_interval: 3h
# A default receiver
receiver: all-admins-email
# All the above attributes are inherited by all child routes and can
# overwritten on each.
# Inhibition rules allow to mute a set of alerts given that another alert is
# firing.
# We use this to mute any warning-level notifications if the same alert is
# already critical.
inhibit_rules:
- source_matchers: [severity="critical"]
target_matchers: [severity="warning"]
# Apply inhibition if the alertname is the same.
# CAUTION:
# If all label names listed in `equal` are missing
# from both the source and target alerts,
# the inhibition rule will apply!
equal: [alertname, cluster, service]
receivers:
- name: 'all-admins-email'
email_configs:
- to: 'mirsal@mirsal.fr,mirsal@labolyon.fr,vinishor@vinishor.xyz'
send_resolved: true
@@ -1,71 +1,31 @@
{{ ansible_managed | comment }} {{ ansible_managed | comment }}
# Global configuration # Global configuration
global: global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s). # scrape_timeout is set to the global default (10s).
# Alertmanager configuration # Alertmanager configuration
alerting: alerting:
alertmanagers: alertmanagers:
- static_configs: - static_configs:
- targets: - targets:
- localhost:9093 - localhost:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'. # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files: rule_files:
- "{{ alertmanager_rules }}/prometheus.rules.yml" - "{{ alertmanager_rules }}/prometheus.rules.yml"
- "{{ alertmanager_rules }}/blackbox.rules.yml" - "{{ alertmanager_rules }}/blackbox.rules.yml"
- "{{ alertmanager_rules }}/hosts.rules.yml" - "{{ alertmanager_rules }}/hosts.rules.yml"
# A scrape configuration containing exactly one endpoint to scrape: # A scrape configuration containing exactly one endpoint to scrape:
scrape_config_files:
#scrape_config_files: {% for item in scrape_files %}
#{% for item in scrape_files %} - "{{ item }}"
# - "{{ item }}" {% endfor %}
#{% endfor %}
scrape_configs:
scrape_configs: - job_name: "prometheus"
- job_name: "prometheus" static_configs:
static_configs: - targets: ["localhost:9090"]
- targets: ["localhost:9090"]
{% if blackbox %}
- job_name: "blackbox"
metrics_path: /probe
params:
module: [http_2xx]
scrape_interval: 5s
static_configs:
- targets:
- https://labolyon.fr
- https://mail.labolyon.fr
- https://wiki.labolyon.fr
- https://git.labolyon.fr
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: target
- target_label: __address__
replacement: 127.0.0.1:9115 # The blackbox exporter's real hostname:port.
{% else %}
- job_name: "linux-nodes"
static_configs:
- targets:
- lolmox.labolyon.dn42:9100
- lolmox2.labolyon.dn42:9100
- blogs.labolyon.dn42:9100
- dn42-router.labolyon.dn42:9100
- git.labolyon.dn42:9100
- labolyon-fr.labolyon.dn42:9100
- lolix-rs1.labolyon.dn42:9100
- mail.labolyon.dn42:9100
- matrix.labolyon.dn42:9100
- monitoring.labolyon.dn42:9100
- mosquitto.labolyon.dn42:9100
- radius.labolyon.dn42:9100
- reverse-proxy.labolyon.dn42:9100
- wiki.labolyon.dn42:9100
{% endif %}
@@ -1,4 +1,8 @@
- job_name: "blackbox" # managed by ansible
scrape_configs:
- job_name: "blackbox-public-https"
metrics_path: /probe metrics_path: /probe
params: params:
module: [http_2xx] module: [http_2xx]
@@ -6,13 +10,33 @@
static_configs: static_configs:
- targets: - targets:
- https://labolyon.fr - https://labolyon.fr
- https://mail.labolyon.fr - https://webmail.labolyon.fr
- https://wiki.labolyon.fr - https://wiki.labolyon.fr
- https://git.labolyon.fr - https://git.labolyon.fr
- https://sso.labolyon.fr
- https://chat.labolyon.fr
- https://grafana.labolyon.fr
relabel_configs: relabel_configs:
- source_labels: [__address__] - source_labels: [__address__]
target_label: __param_target target_label: __param_target
- source_labels: [__param_target] - source_labels: [__param_target]
target_label: target target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9115 # The blackbox exporter's real hostname:port.
- job_name: "blackbox-internal-https"
metrics_path: /probe
params:
module: [http_2xx_selfsigned]
scrape_interval: 5s
static_configs:
- targets:
- https://octoprint.labolyon.dn42/login/
- https://stickers.labolyon.dn42
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__ - target_label: __address__
replacement: 127.0.0.1:9115 # The blackbox exporter's real hostname:port. replacement: 127.0.0.1:9115 # The blackbox exporter's real hostname:port.
@@ -1,13 +1,17 @@
scrape_configs:
- job_name: "linux-nodes" - job_name: "linux-nodes"
static_configs: static_configs:
- targets: - targets:
- ansible.labolyon.dn42:9100
- dn42-router.labolyon.dn42:9100
- dns.labolyon.dn42:9100
- git.labolyon.dn42:9100
- i2p.labolyon.dn42:9100
- labolyon-fr.labolyon.dn42:9100
# - lolix-ixpman.labolyon.dn42:9100
- lolix-rs1.labolyon.dn42:9100
- lolmox.labolyon.dn42:9100 - lolmox.labolyon.dn42:9100
- lolmox2.labolyon.dn42:9100 - lolmox2.labolyon.dn42:9100
- blogs.labolyon.dn42:9100
- dn42-router.labolyon.dn42:9100
- git.labolyon.dn42:9100
- labolyon-fr.labolyon.dn42:9100
- lolix-rs1.labolyon.dn42:9100
- mail.labolyon.dn42:9100 - mail.labolyon.dn42:9100
- matrix.labolyon.dn42:9100 - matrix.labolyon.dn42:9100
- monitoring.labolyon.dn42:9100 - monitoring.labolyon.dn42:9100
@@ -15,3 +19,9 @@
- radius.labolyon.dn42:9100 - radius.labolyon.dn42:9100
- reverse-proxy.labolyon.dn42:9100 - reverse-proxy.labolyon.dn42:9100
- wiki.labolyon.dn42:9100 - wiki.labolyon.dn42:9100
- zigbee2mqtt.labolyon.dn42:9100
metric_relabel_configs:
- source_labels: [__name__, state]
separator: '_'
regex: node_systemd_unit_state_[^f].*
action: drop
-2
View File
@@ -2,7 +2,6 @@
# vars file for tools role # vars file for tools role
common_packages: common_packages:
- htop - htop
- neofetch
- curl - curl
- bash - bash
- figlet - figlet
@@ -10,6 +9,5 @@ common_packages:
- rsync - rsync
- needrestart - needrestart
- lynis - lynis
- apt-listbugs
- dnsutils - dnsutils
- libpam-radius-auth - libpam-radius-auth
+10 -1
View File
@@ -1,5 +1,4 @@
--- ---
- name: Load variables - name: Load variables
include_vars: "{{ ansible_os_family|lower }}.yml" include_vars: "{{ ansible_os_family|lower }}.yml"
@@ -50,6 +49,16 @@
group: root group: root
mode: 0640 mode: 0640
- name: Linux | Install sudoers file for sudo group
ansible.builtin.template:
src: sudo_sudoers
dest: "/etc/sudoers.d/sudo"
backup: yes
owner: root
group: root
mode: 0640
validate: /usr/sbin/visudo -cf %s
- name: Linux | Define MOTD file - name: Linux | Define MOTD file
ansible.builtin.shell: ansible.builtin.shell:
cmd: figlet -t {{ inventory_hostname_short | quote }} > /etc/motd cmd: figlet -t {{ inventory_hostname_short | quote }} > /etc/motd
@@ -0,0 +1,2 @@
# Enable passwordless sudo for sudo members
%sudo ALL=(ALL) NOPASSWD: ALL
+1 -1
View File
@@ -1,5 +1,5 @@
--- ---
## Define custom UIDs to avoid conflicts
user_details: user_details:
- { name: vinishor, uid: 2000 } - { name: vinishor, uid: 2000 }
- { name: mirsal, uid: 2001 } - { name: mirsal, uid: 2001 }