Functional base playbook
commit
1d649fee18
|
@ -0,0 +1 @@
|
|||
~/.vault_password
|
|
@ -0,0 +1,42 @@
|
|||
### Install Ansible
|
||||
|
||||
```
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### Ansible Vault
|
||||
|
||||
To manage secrets, this repository use Ansible Vault.
|
||||
|
||||
Create a secret
|
||||
|
||||
```
|
||||
ansible-vault create inv/host_vars/new.chosto.me/secrets.yml
|
||||
```
|
||||
|
||||
Edit a secret
|
||||
|
||||
```
|
||||
ansible-vault edit inv/host_vars/new.chosto.me/secrets.yml
|
||||
```
|
||||
|
||||
### Server
|
||||
|
||||
All servers managed should have this base configuration in order to work :
|
||||
|
||||
- a user `chosto`
|
||||
- SSH access allowed for this user
|
||||
- a root access (`sudo`) for user `chosto` with a password specified as `ansible_become_pass` in inventory
|
||||
|
||||
*e.g.*
|
||||
|
||||
```
|
||||
# adduser chosto
|
||||
# adduser chosto sudo
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
ansible-playbook [-t tag1 tag2...] all.yml
|
||||
```
|
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
- hosts: all
|
||||
become: yes
|
||||
roles:
|
||||
- role: base
|
||||
tags: ["base"]
|
||||
- role: cron
|
||||
tags: ["cron"]
|
||||
- role: ufw
|
||||
tags: ["ufw"]
|
||||
- role: fail2ban
|
||||
tags: ["fail2ban"]
|
||||
|
||||
- hosts: all
|
||||
become: yes
|
||||
roles:
|
||||
- role: "node-exporter"
|
||||
tags: ["node-exporter"]
|
|
@ -0,0 +1,35 @@
|
|||
[defaults]
|
||||
|
||||
# No cows because I am not a funny person
|
||||
nocows = 1
|
||||
force_color = True
|
||||
stdout_callback = unixy
|
||||
|
||||
# Default inventory file, override with -i
|
||||
inventory = ./inv/static.yml
|
||||
|
||||
# Where to load roles
|
||||
roles_path = ./roles
|
||||
|
||||
# Smart facts gathering : https://docs.ansible.com/ansible/latest/reference_appendices/config.html#default-gathering
|
||||
gathering = smart
|
||||
|
||||
# Local file with vault password
|
||||
vault_password_file = ~/.vault_password
|
||||
|
||||
# Do not create .retry files
|
||||
retry_files_enabled = False
|
||||
|
||||
# python interpreter auto-discovery
|
||||
interpreter_python = /usr/bin/python3
|
||||
|
||||
# Fail on undefined variables
|
||||
error_on_undefined_vars = True
|
||||
|
||||
[privilege_escalation]
|
||||
# Default sudo user
|
||||
become_user = root
|
||||
|
||||
[ssh_connection]
|
||||
pipelining = True
|
||||
scp_if_ssh = True
|
|
@ -0,0 +1,10 @@
|
|||
ihl_base_users:
|
||||
- name: chosto
|
||||
group: chosto
|
||||
groups:
|
||||
- sudo
|
||||
ssh_keys:
|
||||
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC6fs07sdt9PbzzQ6IA2tkbPLqspaWXAMLzUK/LtXQBhN/+q4Bxz4I4eUyF7regsWgvOObjKoMilGfOXi2Q8ZZIXZ3DBqSMJpYkwVC0qqU3YJfVLhNa1NU5m+QYqhmREu8HIIFty4jZRTmkAxjy5Zv8af4l3q0VEWUxGV0MoDsJYroao5UcOPKo/Qv75ZIy7x4KWLcXMM1jYLczjF0E6XR99aOWex1XuAvW5bDS9wC+fAN/nMRS7A6Wsvt2tyth9lR40fM0IaUjG+TjQ2CCbmp7zFBpa0LQcCktksSXpfd4Vj6eczHz7N+l1V+inbAd99s84K7LKoTH0tXv02c42XSK52pVBUzyif2EO85dgHJ3NFmTcNdRJ1v5bSRu3vm0Gcq0kgWjYZq2TCHUYOkm5WWdJuDLIbPLydaSr8LGfv+QqL6RHJnKBt5CZ5Nrrei/ZPTjZCm/OgCrmbMQQeoSpE8ZBEMSlN5An5+ZuaR7BPfCNFoQK/mcbA2cqs6ZiNUQdoeb93DAbsQMqDtCnevDf7hbiy282rRMkRYX5Cj6vt3jpUKS7vwoDMIKWYAOKASPZ2IgvC6Buj8aE4p24qR3xbiTHF4iJyxdo2B/x1pwT+kRmCdmCK5XnlkrQfrwP1Kkaiz88XOxkqfsvpRWd1JUUcipYbO+7zTvVQZkLnKZ2AzciQ== quentinduchemin@tuta.io
|
||||
|
||||
ihl_base_ssh_users:
|
||||
- chosto
|
|
@ -0,0 +1,7 @@
|
|||
$ANSIBLE_VAULT;1.1;AES256
|
||||
33343337653333343366613634323137303835383230363964333832666562633230656233636530
|
||||
3462643333626535363437656337363239653533633830320a633762323565393235616431626361
|
||||
65313861666266313336626537383636666566383634363234613532373631343061323837633636
|
||||
3762333033636462330a323362323034336365326432373030626634396265343365393162326538
|
||||
33663862303831646239383735353766616464386532346665316664376434666363633034396363
|
||||
3763316133353034653439316538383563353739323132626164
|
|
@ -0,0 +1,10 @@
|
|||
firewall_in_ports:
|
||||
- "80"
|
||||
- "443"
|
||||
- "{{ ssh_port }}"
|
||||
|
||||
hostname: chosto
|
||||
|
||||
ssh_port: "2220"
|
||||
|
||||
prometheus_server_ip: "51.178.182.35"
|
|
@ -0,0 +1,6 @@
|
|||
all:
|
||||
hosts:
|
||||
new.chosto.me:
|
||||
ansible_port: 2220
|
||||
ansible_user: chosto
|
||||
ansible_ssh_private_key_file: ~/.ssh/scaleway
|
|
@ -0,0 +1 @@
|
|||
ansible==2.9.6
|
|
@ -0,0 +1,6 @@
|
|||
ihl_base_apt_packages_addons:
|
||||
ihl_base_apt_cache_time: 3600
|
||||
|
||||
ihl_base_additional_groups: []
|
||||
ihl_base_users: []
|
||||
ihl_base_ssh_users: []
|
|
@ -0,0 +1,4 @@
|
|||
- name: Restarts sshd
|
||||
service:
|
||||
name: ssh
|
||||
state: restarted
|
|
@ -0,0 +1,15 @@
|
|||
- name: Update apt cache
|
||||
apt:
|
||||
update_cache: yes
|
||||
cache_valid_time: "{{ ihl_base_apt_cache_time }}"
|
||||
tags: ["update-apt-cache"]
|
||||
|
||||
- name: Install base packages
|
||||
apt:
|
||||
name: "{{ ihl_base_apt_packages }}"
|
||||
state: present
|
||||
|
||||
- name: Install additional packages
|
||||
apt:
|
||||
name: "{{ ihl_base_apt_packages_addons }}"
|
||||
state: present
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
- name: Set hostname
|
||||
hostname:
|
||||
name: "{{ hostname }}"
|
||||
|
||||
- name: Add myself to /etc/hosts
|
||||
lineinfile:
|
||||
dest: /etc/hosts
|
||||
regexp: '^127\.0\.0\.1[ \t]+localhost'
|
||||
line: '127.0.0.1 localhost {{ hostname }}'
|
||||
state: present
|
|
@ -0,0 +1,15 @@
|
|||
- include: apt.yml
|
||||
tags:
|
||||
- apt
|
||||
|
||||
- include: users.yml
|
||||
tags:
|
||||
- users
|
||||
|
||||
- include: hostname.yml
|
||||
tags:
|
||||
- hostname
|
||||
|
||||
- include: ssh.yml
|
||||
tags:
|
||||
- ssh
|
|
@ -0,0 +1,17 @@
|
|||
- name: Deploys sshd config
|
||||
template:
|
||||
src: sshd_config.j2
|
||||
dest: /etc/ssh/sshd_config
|
||||
owner: root
|
||||
group: root
|
||||
mode: 0644
|
||||
notify:
|
||||
- Restarts sshd
|
||||
|
||||
- name: Configure authorized SSH keys
|
||||
authorized_key:
|
||||
user: "{{ item.name }}"
|
||||
key: "{{ item.ssh_keys | default([]) | join('\n') }}"
|
||||
state: present
|
||||
exclusive: True
|
||||
loop: "{{ ihl_base_users }}"
|
|
@ -0,0 +1,32 @@
|
|||
- name: Creates primary groups
|
||||
group:
|
||||
name: "{{ item.group | default(item.name) }}"
|
||||
state: present
|
||||
loop: "{{ ihl_base_users }}"
|
||||
|
||||
- name: Creates additional groups
|
||||
group:
|
||||
name: "{{ item.name }}"
|
||||
gid: "{{ item.gid | default(omit) }}"
|
||||
state: present
|
||||
loop: "{{ ihl_base_additional_groups }}"
|
||||
|
||||
- name: Creates users
|
||||
user:
|
||||
name: "{{ item.name }}"
|
||||
uid: "{{ item.uid | default(omit) }}"
|
||||
group: "{{ item.group | default(item.name) }}"
|
||||
groups: "{{ item.groups | default([]) | union([item.group | default(item.name)]) | unique }}"
|
||||
home: "{{ item.home | default('/home/' ~ item.name ) }}"
|
||||
shell: /bin/bash
|
||||
password: "{{ item.password | default(omit) }}"
|
||||
update_password: on_create
|
||||
system: "{{ item.system | default(omit) }}"
|
||||
append: "{{ user.append | default('yes') }}"
|
||||
loop: "{{ ihl_base_users }}"
|
||||
|
||||
- name: Remove "debian" user
|
||||
user:
|
||||
name: debian
|
||||
state: absent
|
||||
remove: yes
|
|
@ -0,0 +1,56 @@
|
|||
Port {{ ssh_port }}
|
||||
|
||||
# Necessary so X11 still works without IPv6
|
||||
AddressFamily inet
|
||||
|
||||
Protocol 2
|
||||
# HostKeys for protocol version 2
|
||||
HostKey /etc/ssh/ssh_host_rsa_key
|
||||
HostKey /etc/ssh/ssh_host_ecdsa_key
|
||||
HostKey /etc/ssh/ssh_host_ed25519_key
|
||||
|
||||
# Logging
|
||||
SyslogFacility AUTH
|
||||
LogLevel INFO
|
||||
|
||||
# Authentication
|
||||
LoginGraceTime 2m
|
||||
PermitRootLogin prohibit-password
|
||||
StrictModes yes
|
||||
PubkeyAuthentication yes
|
||||
|
||||
# Don't read the user's ~/.rhosts and ~/.shosts files
|
||||
IgnoreRhosts yes
|
||||
# similar for protocol version 2
|
||||
HostbasedAuthentication no
|
||||
|
||||
PermitEmptyPasswords no
|
||||
ChallengeResponseAuthentication no
|
||||
PasswordAuthentication no
|
||||
|
||||
# Disable several features
|
||||
KerberosAuthentication no
|
||||
GSSAPIAuthentication no
|
||||
UseDNS no
|
||||
X11Forwarding no
|
||||
|
||||
PrintMotd no
|
||||
PrintLastLog yes
|
||||
TCPKeepAlive yes
|
||||
|
||||
# Allow client to pass locale environment variables
|
||||
AcceptEnv LANG LC_*
|
||||
|
||||
Subsystem sftp /usr/lib/openssh/sftp-server
|
||||
|
||||
# Set this to 'yes' to enable PAM authentication, account processing,
|
||||
# and session processing. If this is enabled, PAM authentication will
|
||||
# be allowed through the ChallengeResponseAuthentication and
|
||||
# PasswordAuthentication. Depending on your PAM configuration,
|
||||
# PAM authentication via ChallengeResponseAuthentication may bypass
|
||||
# the setting of "PermitRootLogin without-password".
|
||||
# If you just want the PAM account and session checks to run without
|
||||
# PAM authentication, then enable this but set PasswordAuthentication
|
||||
# and ChallengeResponseAuthentication to 'no'.
|
||||
UsePAM yes
|
||||
AllowUsers {{ ihl_base_ssh_users | join(' ') }}
|
|
@ -0,0 +1,16 @@
|
|||
ihl_base_apt_packages:
|
||||
- apt-transport-https
|
||||
- ca-certificates
|
||||
- curl
|
||||
- dnsutils
|
||||
- git
|
||||
- htop
|
||||
- jq
|
||||
- less
|
||||
- lm-sensors
|
||||
- python3
|
||||
- python3-pip
|
||||
- python3-setuptools
|
||||
- smartmontools
|
||||
- sudo
|
||||
- nano
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
- name: Restart rsyslog
|
||||
service:
|
||||
name: rsyslog
|
||||
state: restarted
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
- name: Enable logging for cron
|
||||
lineinfile:
|
||||
path: /etc/rsyslog.conf
|
||||
regexp: "^cron.* /var/log/cron.log"
|
||||
insertafter: "^#cron.*"
|
||||
line: "cron.* /var/log/cron.log"
|
||||
notify: Restart rsyslog
|
|
@ -0,0 +1,4 @@
|
|||
- name: Restarts fail2ban
|
||||
service:
|
||||
name: fail2ban
|
||||
state: restarted
|
|
@ -0,0 +1,21 @@
|
|||
---
|
||||
- name: Install fail2ban
|
||||
apt:
|
||||
name: fail2ban
|
||||
state: present
|
||||
|
||||
- name: Enable fail2ban for SSH
|
||||
template:
|
||||
src: jail.local.j2
|
||||
# jail.local overrides jail.conf but does not replace
|
||||
# we can just put our little SSH conf (port and log file) inside
|
||||
dest: /etc/fail2ban/jail.local
|
||||
owner: root
|
||||
group: root
|
||||
mode: 0644
|
||||
notify: Restarts fail2ban
|
||||
|
||||
- name: Enable fail2ban
|
||||
service:
|
||||
name: fail2ban
|
||||
enabled: true
|
|
@ -0,0 +1,5 @@
|
|||
[sshd]
|
||||
mode = normal
|
||||
port = {{ ssh_port }}
|
||||
logpath = {{ fail2ban_log_path | default('/var/log/fail2ban.log') }}
|
||||
backend = %(sshd_backend)s
|
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
- name: Prometheus node exporter
|
||||
apt:
|
||||
name:
|
||||
- prometheus-node-exporter
|
||||
state: present
|
||||
|
||||
- name: Allow queries from prometheus server
|
||||
ufw:
|
||||
rule: allow
|
||||
port: "9100"
|
||||
direction: in
|
||||
proto: tcp
|
||||
from: "{{ prometheus_server_ip }}"
|
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
- name: Install ufw
|
||||
apt:
|
||||
name:
|
||||
- ufw
|
||||
state: present
|
||||
|
||||
- name: Configure UFW rules
|
||||
ufw:
|
||||
rule: allow
|
||||
port: "{{ item }}"
|
||||
direction: in
|
||||
proto: any
|
||||
loop: "{{ firewall_in_ports }}"
|
||||
|
||||
- name: Set firewall default in policy
|
||||
ufw:
|
||||
state: enabled
|
||||
direction: incoming
|
||||
policy: deny
|
||||
|
||||
- name: Set firewall default out policy
|
||||
ufw:
|
||||
state: enabled
|
||||
direction: outgoing
|
||||
policy: allow
|
Loading…
Reference in New Issue