first commit
This commit is contained in:
32
README.md
Normal file
32
README.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Linux generic essentials
|
||||||
|
|
||||||
|
Dieses Ansible Projekt beinhaltet eine generische
|
||||||
|
Grundkonfiguration, die jeder Linux Server standardmaessig haben
|
||||||
|
sollte.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Klone dieses Repo:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://gitea.softbox.net/CubelaPetar/ansible-linux-default.git
|
||||||
|
cd ansible-linux-default
|
||||||
|
```
|
||||||
|
|
||||||
|
Oeffne die Datei `hosts.ini` und passe die IP-Adresse an (und potentiel andere relevante Variablen).
|
||||||
|
|
||||||
|
Teste mit dem folgenden _ad hoc_ Befehl die Kommunikation zum Server
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ansible all -m ping
|
||||||
|
```
|
||||||
|
|
||||||
|
Dieser Befehl nutzt das Ansible `ping` Modul und sendet einen Ping an alle Server, die in der inventory-Datei `hosts.ini` hinterlegt sind.
|
||||||
|
|
||||||
|
Wenn die Kommunikation sichergestellt ist, fuehre als naechstes den Befehl
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ansible-playbook run.yml -K
|
||||||
|
```
|
||||||
|
|
||||||
|
aus und gebe das `sudo` Passwort ein.
|
||||||
7
ansible.cfg
Normal file
7
ansible.cfg
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
[defaults]
|
||||||
|
nocows = 1
|
||||||
|
host_key_checking = false
|
||||||
|
inventory = ./hosts.ini
|
||||||
|
|
||||||
|
[ssh_connections]
|
||||||
|
pipelining = true
|
||||||
54
group_vars/all.yml
Normal file
54
group_vars/all.yml
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
---
|
||||||
|
# generic settings
|
||||||
|
main_username: sbxadmin
|
||||||
|
main_groupname: "{{ main_username }}"
|
||||||
|
main_uid: "1000"
|
||||||
|
main_gid: "{{ main_uid }}"
|
||||||
|
|
||||||
|
# weareinteractive.environment
|
||||||
|
environment_config: { "PUID": "{{ main_gid }}", "PGID": "{{ main_gid }}" }
|
||||||
|
|
||||||
|
# geerlingguy.ntp
|
||||||
|
ntp_timezone: "Europe/Berlin"
|
||||||
|
|
||||||
|
# geerlingguy.nfs
|
||||||
|
#nfs_exports: [ "/home/public *(rw,sync,no_root_squash)" ]
|
||||||
|
|
||||||
|
# geerlingguy.security
|
||||||
|
security_ssh_port: 22
|
||||||
|
security_ssh_password_authentication: "yes"
|
||||||
|
security_ssh_permit_root_login: "no"
|
||||||
|
security_ssh_usedns: "no"
|
||||||
|
security_ssh_permit_empty_password: "no"
|
||||||
|
security_ssh_challenge_response_auth: "no"
|
||||||
|
security_ssh_gss_api_authentication: "no"
|
||||||
|
security_ssh_x11_forwarding: "no"
|
||||||
|
security_ssh_allowed_users:
|
||||||
|
- "{{ main_username }}"
|
||||||
|
security_ssh_allowed_groups: []
|
||||||
|
security_sudoers_passwordless:
|
||||||
|
- "{{ main_username }}"
|
||||||
|
security_autoupdate_enabled: false
|
||||||
|
security_autoupdate_blacklist: []
|
||||||
|
security_autoupdate_reboot: false
|
||||||
|
security_autoupdate_reboot_time: "03:00"
|
||||||
|
security_autoupdate_mail_to: "service@softbox.de"
|
||||||
|
security_autoupdate_mail_on_error: false
|
||||||
|
security_fail2ban_enabled: false
|
||||||
|
security_fail2ban_custom_configuration_template: "jail.local.j2"
|
||||||
|
###
|
||||||
|
#packages
|
||||||
|
#package_list:
|
||||||
|
# - curl
|
||||||
|
# - htop
|
||||||
|
# - vim
|
||||||
|
# - bash-completion
|
||||||
|
# - apt-transport-https
|
||||||
|
# - network-manager
|
||||||
|
# - curl
|
||||||
|
# - xclip
|
||||||
|
# - net-tools
|
||||||
|
# - rsync
|
||||||
|
# - smartmontools
|
||||||
|
# - mlocate
|
||||||
|
# - parted
|
||||||
45
group_vars/snipeit.yml
Normal file
45
group_vars/snipeit.yml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
main_username: root
|
||||||
|
main_groupname: "{{ main_username }}"
|
||||||
|
main_uid: "0"
|
||||||
|
main_gid: "{{ main_uid }}"
|
||||||
|
|
||||||
|
package_list:
|
||||||
|
- curl
|
||||||
|
- vim
|
||||||
|
- xclip
|
||||||
|
- rsync
|
||||||
|
- mlocate
|
||||||
|
docker_compose_generator_output_path: "/root"
|
||||||
|
containers:
|
||||||
|
- service_name: app
|
||||||
|
active: true
|
||||||
|
image: snipe/snipe-it:v7.0.13
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- ./storage:/var/lib/snipeit
|
||||||
|
ports:
|
||||||
|
- "8000:80"
|
||||||
|
depends_on:
|
||||||
|
db:
|
||||||
|
condition: service_healthy
|
||||||
|
restart: true
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
- service_name: db
|
||||||
|
active: true
|
||||||
|
image: mariadb:11.5.2
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- ./db_data:/var/lib/mysql
|
||||||
|
environment:
|
||||||
|
- MYSQL_DATABASE={{ SNIPEIT_DB_DATABASE }}
|
||||||
|
- MYSQL_USER={{ SNIPEIT_DB_USERNAME }}
|
||||||
|
- MYSQL_PASSWORD={{ SNIPEIT_DB_PASSWD }}
|
||||||
|
- MYSQL_ROOT_PASSWORD={{ SNIPEIT_DB_ROOT_PASSWD }}
|
||||||
|
healthcheck:
|
||||||
|
# https://mariadb.com/kb/en/using-healthcheck-sh/#compose-file-example
|
||||||
|
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
|
||||||
|
interval: 5s
|
||||||
|
timeout: 1s
|
||||||
|
retries: 5
|
||||||
4
hosts.ini
Normal file
4
hosts.ini
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
[snipeit]
|
||||||
|
10.0.101.15 ansible_user=root ansible_port=22
|
||||||
|
|
||||||
|
|
||||||
9
playbooks/shutdown.yml
Normal file
9
playbooks/shutdown.yml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
- name: Shutdown k3s_cluster
|
||||||
|
hosts: k3s_cluster
|
||||||
|
gather_facts: true
|
||||||
|
tasks:
|
||||||
|
- name: Shutdown the nodes (and wait one 1 min)
|
||||||
|
become: true
|
||||||
|
community.general.shutdown:
|
||||||
|
delay: 60
|
||||||
29
playbooks/update.yml
Normal file
29
playbooks/update.yml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
- hosts:
|
||||||
|
- all
|
||||||
|
become: true
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Perform a dist-upgrade.
|
||||||
|
ansible.builtin.apt:
|
||||||
|
upgrade: dist
|
||||||
|
update_cache: yes
|
||||||
|
|
||||||
|
- name: Install essential packages
|
||||||
|
package:
|
||||||
|
name: "{{ package_list }}"
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Check if a reboot is required.
|
||||||
|
ansible.builtin.stat:
|
||||||
|
path: /var/run/reboot-required
|
||||||
|
get_checksum: no
|
||||||
|
register: reboot_required_file
|
||||||
|
|
||||||
|
- name: Reboot the server (if required).
|
||||||
|
ansible.builtin.reboot:
|
||||||
|
when: reboot_required_file.stat.exists == true
|
||||||
|
|
||||||
|
- name: Remove dependencies that are no longer required.
|
||||||
|
ansible.builtin.apt:
|
||||||
|
autoremove: yes
|
||||||
8
requirements.yml
Normal file
8
requirements.yml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
roles:
|
||||||
|
#- name: geerlingguy.pip
|
||||||
|
- name: geerlingguy.docker
|
||||||
|
- name: geerlingguy.nfs
|
||||||
|
- name: geerlingguy.security
|
||||||
|
- name: geerlingguy.ntp
|
||||||
|
- name: ironicbadger.docker_compose_generator
|
||||||
5
roles/caddy/defaults/main.yml
Normal file
5
roles/caddy/defaults/main.yml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
caddy_opnsense_cloudflare_binary_url: "https://caddyserver.com/api/download?os=freebsd&arch=amd64&p=github.com%2Fcaddy-dns%2Fcloudflare"
|
||||||
|
caddy_opnsense_caddyfile_path: /usr/local/etc/caddy/
|
||||||
|
|
||||||
|
caddy_amd64_linux_cloudflare_binary_url: "https://caddyserver.com/api/download?os=linux&arch=amd64&p=github.com%2Fcaddy-dns%2Fcloudflare"
|
||||||
|
caddy_linux_caddyfile_path: /etc/caddy
|
||||||
6
roles/caddy/handlers/main.yml
Normal file
6
roles/caddy/handlers/main.yml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
- name: restart caddy
|
||||||
|
service:
|
||||||
|
name: caddy
|
||||||
|
state: restarted
|
||||||
|
enabled: yes
|
||||||
28
roles/caddy/tasks/configure.yml
Normal file
28
roles/caddy/tasks/configure.yml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
- name: install caddy service file
|
||||||
|
template:
|
||||||
|
src: templates/caddy.service.j2
|
||||||
|
dest: "/etc/systemd/system/caddy.service"
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
|
||||||
|
- name: ensure Caddyfile target dir exists
|
||||||
|
file:
|
||||||
|
path: "{{ caddy_linux_caddyfile_path }}"
|
||||||
|
state: directory
|
||||||
|
|
||||||
|
- name: template and install Caddyfile
|
||||||
|
template:
|
||||||
|
src: templates/Caddyfile.j2
|
||||||
|
dest: "{{ caddy_linux_caddyfile_path }}/Caddyfile"
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
#validate: caddy fmt --overwrite
|
||||||
|
#notify: restart caddy
|
||||||
|
|
||||||
|
- name: Enable caddy service
|
||||||
|
ansible.builtin.systemd:
|
||||||
|
name: caddy
|
||||||
|
enabled: yes
|
||||||
|
state: reloaded
|
||||||
|
daemon_reload: yes
|
||||||
19
roles/caddy/tasks/install.yml
Normal file
19
roles/caddy/tasks/install.yml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
- name: download latest release
|
||||||
|
get_url:
|
||||||
|
url: "{{ caddy_amd64_linux_cloudflare_binary_url }}"
|
||||||
|
dest: /usr/local/bin/caddy
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: a+x
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: Add the caddy group
|
||||||
|
ansible.builtin.group:
|
||||||
|
name: caddy
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Add the caddy user
|
||||||
|
ansible.builtin.user:
|
||||||
|
name: caddy
|
||||||
|
group: caddy
|
||||||
11
roles/caddy/tasks/main.yml
Normal file
11
roles/caddy/tasks/main.yml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
- name: install caddy
|
||||||
|
include_tasks:
|
||||||
|
file: install.yml
|
||||||
|
|
||||||
|
- name: configure caddy rules
|
||||||
|
include_tasks:
|
||||||
|
file: configure.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- caddyconfig
|
||||||
84
roles/caddy/templates/Caddyfile.j2
Normal file
84
roles/caddy/templates/Caddyfile.j2
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
(cloudflare) {
|
||||||
|
tls {
|
||||||
|
dns cloudflare {{ opnsense_caddy_cloudflare_api_token }}
|
||||||
|
resolvers 1.1.1.1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(headers) {
|
||||||
|
header {
|
||||||
|
Permissions-Policy interest-cohort=()
|
||||||
|
Strict-Transport-Security "max-age=31536000; includeSubdomains"
|
||||||
|
X-XSS-Protection "1; mode=block"
|
||||||
|
X-Content-Type-Options "nosniff"
|
||||||
|
X-Robots-Tag noindex, nofollow
|
||||||
|
Referrer-Policy "same-origin"
|
||||||
|
Content-Security-Policy "frame-ancestors {{ domain_base }} *.{{ domain_base }}"
|
||||||
|
-Server
|
||||||
|
Permissions-Policy "geolocation=(self {{ domain_base }} *.{{ domain_base }}), microphone=()"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
## core
|
||||||
|
|
||||||
|
#neo
|
||||||
|
neo.{{ domain_base }} {
|
||||||
|
reverse_proxy https://10.56.0.1:8006 {
|
||||||
|
transport http {
|
||||||
|
tls_insecure_skip_verify
|
||||||
|
}
|
||||||
|
}
|
||||||
|
import cloudflare
|
||||||
|
}
|
||||||
|
|
||||||
|
# pihole
|
||||||
|
dns.{{ domain_base }} {
|
||||||
|
redir / /admin
|
||||||
|
reverse_proxy http://10.56.0.253
|
||||||
|
import cloudflare
|
||||||
|
}
|
||||||
|
|
||||||
|
# # dhcp
|
||||||
|
# dhcp.{{ domain_base }} {
|
||||||
|
# redir / /dhcp.leases
|
||||||
|
# reverse_proxy http://10.56.0.253:81
|
||||||
|
# import cloudflare
|
||||||
|
# }
|
||||||
|
|
||||||
|
# opnsense
|
||||||
|
opnsense.{{ domain_base }} {
|
||||||
|
reverse_proxy https://10.56.0.254:8443 {
|
||||||
|
transport http {
|
||||||
|
tls_insecure_skip_verify
|
||||||
|
}
|
||||||
|
}
|
||||||
|
import cloudflare
|
||||||
|
}
|
||||||
|
|
||||||
|
# pain ipmi
|
||||||
|
ipmi.{{ domain_base }} {
|
||||||
|
reverse_proxy https://10.56.0.20 {
|
||||||
|
transport http {
|
||||||
|
tls_insecure_skip_verify
|
||||||
|
}
|
||||||
|
}
|
||||||
|
import cloudflare
|
||||||
|
}
|
||||||
|
|
||||||
|
## pikvm
|
||||||
|
#kvm.{{ domain_base }} {
|
||||||
|
# reverse_proxy https://10.56.0.100:443 {
|
||||||
|
# transport http {
|
||||||
|
# tls_insecure_skip_verify
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# import cloudflare
|
||||||
|
#}
|
||||||
|
|
||||||
|
# uptime-kuma
|
||||||
|
kuma.{{ domain_base }} {
|
||||||
|
reverse_proxy http://10.56.0.247:3001
|
||||||
|
import cloudflare
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
37
roles/caddy/templates/caddy.service.j2
Normal file
37
roles/caddy/templates/caddy.service.j2
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# caddy.service
|
||||||
|
#
|
||||||
|
# For using Caddy with a config file.
|
||||||
|
#
|
||||||
|
# Make sure the ExecStart and ExecReload commands are correct
|
||||||
|
# for your installation.
|
||||||
|
#
|
||||||
|
# See https://caddyserver.com/docs/install for instructions.
|
||||||
|
#
|
||||||
|
# WARNING: This service does not use the --resume flag, so if you
|
||||||
|
# use the API to make changes, they will be overwritten by the
|
||||||
|
# Caddyfile next time the service is restarted. If you intend to
|
||||||
|
# use Caddy's API to configure it, add the --resume flag to the
|
||||||
|
# `caddy run` command or use the caddy-api.service file instead.
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
Description=Caddy
|
||||||
|
Documentation=https://caddyserver.com/docs/
|
||||||
|
After=network.target network-online.target
|
||||||
|
Requires=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
User=caddy
|
||||||
|
Group=caddy
|
||||||
|
ExecStart=/usr/local/bin/caddy run --environ --config /etc/caddy/Caddyfile
|
||||||
|
ExecReload=/usr/local/bin/caddy reload --config /etc/caddy/Caddyfile --force
|
||||||
|
TimeoutStopSec=5s
|
||||||
|
LimitNOFILE=1048576
|
||||||
|
LimitNPROC=512
|
||||||
|
PrivateDevices=yes
|
||||||
|
PrivateTmp=true
|
||||||
|
ProtectSystem=full
|
||||||
|
AmbientCapabilities=CAP_NET_BIND_SERVICE
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
16
run.yml
Normal file
16
run.yml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
#- hosts: k3s_cluster
|
||||||
|
# become: yes
|
||||||
|
# vars_files:
|
||||||
|
# - "vars/vault.yml"
|
||||||
|
# roles:
|
||||||
|
# - role: geerlingguy.security
|
||||||
|
# - role: geerlingguy.ntp
|
||||||
|
|
||||||
|
- hosts: snipeit
|
||||||
|
vars_files:
|
||||||
|
- "vars/vault.yml"
|
||||||
|
roles:
|
||||||
|
#- role: geerlingguy.security
|
||||||
|
- role: geerlingguy.docker
|
||||||
|
- role: ironicbadger.docker_compose_generator
|
||||||
13
vars/vault.yml
Normal file
13
vars/vault.yml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
$ANSIBLE_VAULT;1.1;AES256
|
||||||
|
61653539633662393863626638666466303131396237373661303939333263303033653638343235
|
||||||
|
6437663430656538303865336663616432313832333532380a323632633339616466313038356239
|
||||||
|
64623565623264303739633134656666363163613361306230343638346330383435623931373364
|
||||||
|
3463643433323631650a613233353266333036643239366330613133643238626132336530653462
|
||||||
|
37643966643663313964373531373731343064613461636564656332336461326235666264643030
|
||||||
|
37663966626561343761623363346539333662613966366564323639306230626265343431366238
|
||||||
|
63353531313165633365323439643033313536306330656332373162373733616338613561383233
|
||||||
|
33376530636530376638383562373862633362366366333130633833633938613462613932313834
|
||||||
|
61353563356361363338356665363364366166346534346137323661363464653934363638303766
|
||||||
|
39633963626231373138636237326531353835343930643535313937656334613462626639326139
|
||||||
|
61326665643862326365356165393361326266616530306330643665386663356536646337343061
|
||||||
|
37353230653062616266
|
||||||
Reference in New Issue
Block a user