first part of config
						commit
						8ee7c76f64
					
				| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
.vagrant/
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
# Ansible Debian
 | 
			
		||||
 | 
			
		||||
This repository contains all the Ansible playbooks & roles I use to manage my various Debian-based servers & Docker swarms.
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
# -*- mode: ruby -*-
 | 
			
		||||
# vi: set ft=ruby :
 | 
			
		||||
Vagrant.configure("2") do |config|
 | 
			
		||||
  config.vm.box = "generic/debian11"
 | 
			
		||||
    
 | 
			
		||||
    # Use the standard insecure SSH key
 | 
			
		||||
    config.ssh.insert_key = false
 | 
			
		||||
    
 | 
			
		||||
    # Don't mount the current directory in the VM
 | 
			
		||||
    config.vm.synced_folder ".", "/vagrant", disabled: true
 | 
			
		||||
 | 
			
		||||
    # config.vm.define "manager" do |m|
 | 
			
		||||
    #   m.vm.network "private_network", ip: "192.168.50.4"
 | 
			
		||||
    #   m.vm.hostname = "manager"
 | 
			
		||||
    # end
 | 
			
		||||
    
 | 
			
		||||
    config.vm.define "alpha" do |n|
 | 
			
		||||
      n.vm.hostname = "alpha.test"
 | 
			
		||||
      n.vm.network :private_network, ip: "192.168.56.5"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    config.vm.define "beta" do |n|
 | 
			
		||||
      n.vm.hostname = "beta.test"
 | 
			
		||||
      n.vm.network :private_network, ip: "192.168.56.6"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    config.vm.define "gamma" do |a|
 | 
			
		||||
      a.vm.hostname = "gamma.test"
 | 
			
		||||
      a.vm.network :private_network, ip: "192.168.56.7"
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Configure non-root user.
 | 
			
		||||
  hosts: all
 | 
			
		||||
  become: yes
 | 
			
		||||
  roles:
 | 
			
		||||
    - create-debian-user
 | 
			
		||||
 | 
			
		||||
- name: Secure SSH.
 | 
			
		||||
  hosts: all
 | 
			
		||||
  become: yes
 | 
			
		||||
  roles:
 | 
			
		||||
    - configure-ssh
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
# This file should only contain static IPs. Dynamic IPs should be defined in
 | 
			
		||||
# originals.ini.
 | 
			
		||||
 | 
			
		||||
# The admin is the main host that initializes the swarm
 | 
			
		||||
admin ansible_host=
 | 
			
		||||
 | 
			
		||||
[managers]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[workers]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[all:vars]
 | 
			
		||||
ansible_ssh_user=debian
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Initialize base server.
 | 
			
		||||
  hosts: all
 | 
			
		||||
  become: yes
 | 
			
		||||
  roles:
 | 
			
		||||
    - install-base-packages
 | 
			
		||||
    - docker
 | 
			
		||||
    - net-security
 | 
			
		||||
 | 
			
		||||
- name: Initialize Docker swarm.
 | 
			
		||||
  hosts: admin
 | 
			
		||||
  become: yes
 | 
			
		||||
  roles:
 | 
			
		||||
    - docker-swarm-init
 | 
			
		||||
  tags: swarm
 | 
			
		||||
 | 
			
		||||
- name: Add managers to swarm.
 | 
			
		||||
  hosts: managers
 | 
			
		||||
  become: yes
 | 
			
		||||
  roles:
 | 
			
		||||
    - docker-swarm-add-manager
 | 
			
		||||
  tags: swarm
 | 
			
		||||
 | 
			
		||||
- name: Add workers to swarm.
 | 
			
		||||
  hosts: workers
 | 
			
		||||
  become: yes
 | 
			
		||||
  roles:
 | 
			
		||||
    - docker-swarm-add-worker
 | 
			
		||||
  tags: swarm
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,121 @@
 | 
			
		|||
#	$OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $
 | 
			
		||||
 | 
			
		||||
# This is the sshd server system-wide configuration file.  See
 | 
			
		||||
# sshd_config(5) for more information.
 | 
			
		||||
 | 
			
		||||
# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
 | 
			
		||||
 | 
			
		||||
# The strategy used for options in the default sshd_config shipped with
 | 
			
		||||
# OpenSSH is to specify options with their default value where
 | 
			
		||||
# possible, but leave them commented.  Uncommented options override the
 | 
			
		||||
# default value.
 | 
			
		||||
 | 
			
		||||
Port 2222
 | 
			
		||||
#AddressFamily any
 | 
			
		||||
#ListenAddress 0.0.0.0
 | 
			
		||||
#ListenAddress ::
 | 
			
		||||
 | 
			
		||||
#HostKey /etc/ssh/ssh_host_rsa_key
 | 
			
		||||
#HostKey /etc/ssh/ssh_host_ecdsa_key
 | 
			
		||||
#HostKey /etc/ssh/ssh_host_ed25519_key
 | 
			
		||||
 | 
			
		||||
# Ciphers and keying
 | 
			
		||||
#RekeyLimit default none
 | 
			
		||||
 | 
			
		||||
# Logging
 | 
			
		||||
#SyslogFacility AUTH
 | 
			
		||||
#LogLevel INFO
 | 
			
		||||
 | 
			
		||||
# Authentication:
 | 
			
		||||
 | 
			
		||||
#LoginGraceTime 2m
 | 
			
		||||
PermitRootLogin no
 | 
			
		||||
#StrictModes yes
 | 
			
		||||
MaxAuthTries 3
 | 
			
		||||
#MaxSessions 10
 | 
			
		||||
 | 
			
		||||
PubkeyAuthentication yes
 | 
			
		||||
 | 
			
		||||
# Expect .ssh/authorized_keys2 to be disregarded by default in future.
 | 
			
		||||
#AuthorizedKeysFile	.ssh/authorized_keys .ssh/authorized_keys2
 | 
			
		||||
 | 
			
		||||
#AuthorizedPrincipalsFile none
 | 
			
		||||
 | 
			
		||||
#AuthorizedKeysCommand none
 | 
			
		||||
#AuthorizedKeysCommandUser nobody
 | 
			
		||||
 | 
			
		||||
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
 | 
			
		||||
#HostbasedAuthentication no
 | 
			
		||||
# Change to yes if you don't trust ~/.ssh/known_hosts for
 | 
			
		||||
# HostbasedAuthentication
 | 
			
		||||
#IgnoreUserKnownHosts no
 | 
			
		||||
# Don't read the user's ~/.rhosts and ~/.shosts files
 | 
			
		||||
#IgnoreRhosts yes
 | 
			
		||||
 | 
			
		||||
# To disable tunneled clear text passwords, change to no here!
 | 
			
		||||
PasswordAuthentication no
 | 
			
		||||
#PermitEmptyPasswords no
 | 
			
		||||
 | 
			
		||||
# Change to yes to enable challenge-response passwords (beware issues with
 | 
			
		||||
# some PAM modules and threads)
 | 
			
		||||
ChallengeResponseAuthentication no
 | 
			
		||||
 | 
			
		||||
# Kerberos options
 | 
			
		||||
#KerberosAuthentication no
 | 
			
		||||
#KerberosOrLocalPasswd yes
 | 
			
		||||
#KerberosTicketCleanup yes
 | 
			
		||||
#KerberosGetAFSToken no
 | 
			
		||||
 | 
			
		||||
# GSSAPI options
 | 
			
		||||
#GSSAPIAuthentication no
 | 
			
		||||
#GSSAPICleanupCredentials yes
 | 
			
		||||
#GSSAPIStrictAcceptorCheck yes
 | 
			
		||||
#GSSAPIKeyExchange no
 | 
			
		||||
 | 
			
		||||
# 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
 | 
			
		||||
 | 
			
		||||
#AllowAgentForwarding yes
 | 
			
		||||
#AllowTcpForwarding yes
 | 
			
		||||
#GatewayPorts no
 | 
			
		||||
X11Forwarding no
 | 
			
		||||
#X11DisplayOffset 10
 | 
			
		||||
#X11UseLocalhost yes
 | 
			
		||||
#PermitTTY yes
 | 
			
		||||
PrintMotd no
 | 
			
		||||
#PrintLastLog yes
 | 
			
		||||
#TCPKeepAlive yes
 | 
			
		||||
#PermitUserEnvironment no
 | 
			
		||||
#Compression delayed
 | 
			
		||||
#ClientAliveInterval 0
 | 
			
		||||
#ClientAliveCountMax 3
 | 
			
		||||
#UseDNS no
 | 
			
		||||
#PidFile /var/run/sshd.pid
 | 
			
		||||
#MaxStartups 10:30:100
 | 
			
		||||
#PermitTunnel no
 | 
			
		||||
#ChrootDirectory none
 | 
			
		||||
#VersionAddendum none
 | 
			
		||||
 | 
			
		||||
# no default banner path
 | 
			
		||||
#Banner none
 | 
			
		||||
 | 
			
		||||
# Allow client to pass locale environment variables
 | 
			
		||||
AcceptEnv LANG LC_*
 | 
			
		||||
 | 
			
		||||
# override default of no subsystems
 | 
			
		||||
Subsystem	sftp	/usr/lib/openssh/sftp-server
 | 
			
		||||
 | 
			
		||||
# Example of overriding settings on a per-user basis
 | 
			
		||||
#Match User anoncvs
 | 
			
		||||
#	X11Forwarding no
 | 
			
		||||
#	AllowTcpForwarding no
 | 
			
		||||
#	PermitTTY no
 | 
			
		||||
#	ForceCommand cvs server
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
---
 | 
			
		||||
- name: restart sshd
 | 
			
		||||
  service:
 | 
			
		||||
    name: sshd
 | 
			
		||||
    state: restarted
 | 
			
		||||
    enabled: yes
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Copy over sshd config file.
 | 
			
		||||
  copy:
 | 
			
		||||
    src: sshd_config
 | 
			
		||||
    dest: /etc/ssh/sshd_config
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
    mode: '600'
 | 
			
		||||
  notify: restart sshd
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCkDjXuZn+blanbJAhte8KttrpeCPeT5CGcZ5mlAZv724wTa4qebpwCnf4SK4aFuDQEuCusnia3+X7YWAyCDReNURznAWCtq+b8LGxyIm2hTBbLA1m8sj0xidR/djlUtOwDp9VpSNamUWyiPWJ+WNsPd9xLJ6BK3qRsoFiMN87sO12L7DHHDaMze628Oc+IxFd+VZnH0dPVgitis31f+lXCr8w5qSiEepDJ8Nde8M+Ev1RrPQbR5Q5C+wYxlbY0oPNlGqSrs5i1jJl0BVMI4DlibxatTfuteU5IwcDMQObJr3xJGKNTPswSdzpfJFrLfUBZvsDs94BXEHR2CtxZ4aLQPeLfosWe4zuGvX22p7TzSPx1LkuqIF85Tw1PvK3f7u3l9sozHORAoEA8sFHG+DolqldgjuUgCGpfF/QOY1jkGpbEhq57kKFH+VlFI2XePGQ6299R9RN/Y4S88v14ChLwoLSNWgxK+CgYgB4lbquAIKTKsRla3gkEeziz+qoHPQkD5RcajrWOfSKU4alORpgQerSFZ9zMoz9N2rfTVEzCsVUj0Jiwtd5O7pCX9PWBhz1Nl1ItrRPuFiTSKB05dqsQ1CDZAZMDPJNqotd6QRS5+cKzFLgvU6k/gk08/qV00VM+BxlXkh8PwAhaxNPjMxjzqHx0+xC38FtacuhJiOV91Q== roosensjef@gmail.com
 | 
			
		||||
 | 
			
		||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCgHqW7mLuaW8XEFJrg031ES7v7y6Uk5QUp++axTd0wzvt5qfqTox9Hg1Xk5C9hdEfYzS5NCU+uoiInR0aHZ3Cl+yxqi3VqDfO20j6Irrt2SOBB86Gsyu9Brj62xtS0rY/e9rmyULJGUtJEz3UmFvn8fE5hUpGjDg7NByFs8f054pzifWw8F/wOvF5rKo9GqkWeXEUZ456FmowXCQLl5SypQliOsHJDs89NiTVvOxiKQXULBhj8o4c0MyCeFfPWqOutSSAetmbnegEjOTy7f/0IiqB+5713KOh1Bm1/u+3J2IVbRgeG1iTJdDVeIxBGmA1wMLvrBtBRIS0MaKa1Xabo3QTgYPHNGrf2w+GMnuoQ6/tdD6omPWGTHXqtHKEeIW1JrlDyhOo86oCl+l2aveMwhFFGW4nQmW7sfrowyLHdU3BpGl4m7pGa+5sTsHiOGEqEN/a7xikztXkuKacQ8E/y1C8gDXgaX8zFl6VOwR5EfMEMX390tz+R+ErDU81h47tSkwbY3KhunSKwPT8jSMldBttnCIexd+QuQgOlSwXkYVPPmXtPUkfp+4VzWSWeGKAa9k3HtVMIvKdVk9eXDVNnVdaAL+EkHyXOyFVVGa9gJ3ZOWhHMNi2/kHAwWMI9CwRxj7AVk30KGBhPN0wdS9Dt8/0Aa33hWuY2p9DxtNaiNw== roosensjef@gmail.com
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Install sudo.
 | 
			
		||||
  apt:
 | 
			
		||||
    name: sudo
 | 
			
		||||
    state: present
 | 
			
		||||
 | 
			
		||||
- name: Create debian user.
 | 
			
		||||
  user:
 | 
			
		||||
    name: debian
 | 
			
		||||
    groups: sudo
 | 
			
		||||
    append: true
 | 
			
		||||
    create_home: yes
 | 
			
		||||
    shell: /bin/bash
 | 
			
		||||
    password: "{{ debian_pass | password_hash('sha512') }}"
 | 
			
		||||
    update_password: on_create
 | 
			
		||||
 | 
			
		||||
- name: Create SSH directory.
 | 
			
		||||
  file:
 | 
			
		||||
    path: /home/debian/.ssh/
 | 
			
		||||
    state: directory
 | 
			
		||||
    owner: debian
 | 
			
		||||
    group: debian
 | 
			
		||||
    mode: '700'
 | 
			
		||||
 | 
			
		||||
- name: Add authorized SSH keys.
 | 
			
		||||
  copy:
 | 
			
		||||
    src: authorized_keys
 | 
			
		||||
    dest: /home/debian/.ssh/authorized_keys
 | 
			
		||||
    owner: debian
 | 
			
		||||
    group: debian
 | 
			
		||||
    mode: '600'
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,17 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Check if swarm is already Initialized
 | 
			
		||||
  shell: docker node ls
 | 
			
		||||
  register: swarm_status
 | 
			
		||||
  ignore_errors: true
 | 
			
		||||
 | 
			
		||||
- name: Check node state.
 | 
			
		||||
  register: node_state
 | 
			
		||||
  shell: "docker info --format '{{ '{{' }}.Swarm.LocalNodeState{{ '}}' }}'"
 | 
			
		||||
  ignore_errors: true
 | 
			
		||||
 | 
			
		||||
- name: Add managers to the swarm
 | 
			
		||||
  shell: >
 | 
			
		||||
    docker swarm join
 | 
			
		||||
    --token {{ hostvars.admin.manager_token }}
 | 
			
		||||
    {{ hostvars.admin.ansible_host }}:2377
 | 
			
		||||
  when: swarm_status.rc != 0 and node_state.stdout not in [ 'active', 'locked', 'error' ]
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Check node state.
 | 
			
		||||
  register: node_state
 | 
			
		||||
  shell: "docker info --format '{{ '{{' }}.Swarm.LocalNodeState{{ '}}' }}'"
 | 
			
		||||
  ignore_errors: true
 | 
			
		||||
 | 
			
		||||
- name: Add worker to swarm.
 | 
			
		||||
  register: join_cmd
 | 
			
		||||
  shell: >
 | 
			
		||||
    docker swarm join
 | 
			
		||||
    --token {{ hostvars.admin.worker_token }}
 | 
			
		||||
    {{ hostvars.admin.ansible_host }}:2377
 | 
			
		||||
  # 0 means it was successfully added, 1 means it's already in the swarm.
 | 
			
		||||
  failed_when: join_cmd.rc != 0
 | 
			
		||||
  changed_when: join_cmd.rc == 0
 | 
			
		||||
  when: node_state.stdout not in [ 'active', 'locked', 'error' ]
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
# https://github.com/ruanbekker/ansible-docker-swarm/blob/master/roles/docker-swarm-init/tasks/main.yml
 | 
			
		||||
---
 | 
			
		||||
# Basically we put the exit code in the variable and use it later
 | 
			
		||||
- name: Check if swarm has already been initialized.
 | 
			
		||||
  shell: docker node ls
 | 
			
		||||
  register: swarm_status
 | 
			
		||||
  ignore_errors: true
 | 
			
		||||
  changed_when: false
 | 
			
		||||
 | 
			
		||||
- name: Initialize Docker Swarm.
 | 
			
		||||
  shell: >
 | 
			
		||||
    docker swarm init
 | 
			
		||||
    --advertise-addr={{ hostvars[inventory_hostname]['ansible_host'] }}:2377
 | 
			
		||||
  when: swarm_status.rc != 0
 | 
			
		||||
  run_once: true
 | 
			
		||||
 | 
			
		||||
- name: Get manager join token.
 | 
			
		||||
  shell: docker swarm join-token --quiet manager
 | 
			
		||||
  register: manager_token
 | 
			
		||||
  changed_when: false
 | 
			
		||||
 | 
			
		||||
- name: Store manager join token as fact.
 | 
			
		||||
  set_fact:
 | 
			
		||||
    manager_token: "{{ manager_token.stdout }}"
 | 
			
		||||
 | 
			
		||||
- name: Get worker join token.
 | 
			
		||||
  shell: docker swarm join-token --quiet worker
 | 
			
		||||
  register: worker_token
 | 
			
		||||
  changed_when: false
 | 
			
		||||
 | 
			
		||||
- name: Store worker join token as fact.
 | 
			
		||||
  set_fact:
 | 
			
		||||
    worker_token: "{{ worker_token.stdout }}"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,60 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Ensure older Docker versions aren't installed.
 | 
			
		||||
  apt:
 | 
			
		||||
    name:
 | 
			
		||||
      - docker
 | 
			
		||||
      - docker-engine
 | 
			
		||||
      - docker.io
 | 
			
		||||
      - containerd
 | 
			
		||||
      - runc
 | 
			
		||||
    state: absent
 | 
			
		||||
 | 
			
		||||
- name: Install Docker PPA dependencies.
 | 
			
		||||
  apt:
 | 
			
		||||
    name:
 | 
			
		||||
      - apt-transport-https
 | 
			
		||||
      - ca-certificates
 | 
			
		||||
      - gnupg
 | 
			
		||||
      - lsb-release
 | 
			
		||||
    state: present
 | 
			
		||||
 | 
			
		||||
- name: Add Docker GPG key.
 | 
			
		||||
  apt_key:
 | 
			
		||||
    url: https://download.docker.com/linux/ubuntu/gpg
 | 
			
		||||
    state: present
 | 
			
		||||
 | 
			
		||||
- name: Add Docker PPA.
 | 
			
		||||
  apt_repository:
 | 
			
		||||
    # https://gist.github.com/rbq/886587980894e98b23d0eee2a1d84933
 | 
			
		||||
    repo: "deb [arch={{ ansible_architecture | replace('aarch64', 'arm64') | replace('x86_64', 'amd64') }}] https://download.docker.com/{{ ansible_system | lower }}/{{ ansible_distribution | lower }} {{ ansible_distribution_release }} stable"
 | 
			
		||||
    state: present
 | 
			
		||||
 | 
			
		||||
- name: Install Docker, docker-compose & cron.
 | 
			
		||||
  apt:
 | 
			
		||||
    update_cache: yes
 | 
			
		||||
    name:
 | 
			
		||||
      - docker-ce
 | 
			
		||||
      - docker-ce-cli
 | 
			
		||||
      - containerd.io
 | 
			
		||||
      - docker-compose
 | 
			
		||||
      - cron
 | 
			
		||||
    state: present
 | 
			
		||||
 | 
			
		||||
- name: Ensure Docker is running & enabled.
 | 
			
		||||
  service:
 | 
			
		||||
    name: docker
 | 
			
		||||
    state: started
 | 
			
		||||
    enabled: true
 | 
			
		||||
 | 
			
		||||
- name: Add Docker prune cronjob.
 | 
			
		||||
  cron:
 | 
			
		||||
    name: Prune the Docker system.
 | 
			
		||||
    hour: 4
 | 
			
		||||
    minute: 0
 | 
			
		||||
    job: docker system prune -af
 | 
			
		||||
 | 
			
		||||
- name: Add debian user to docker group.
 | 
			
		||||
  user:
 | 
			
		||||
    name: debian
 | 
			
		||||
    groups: docker
 | 
			
		||||
    append: true
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Install frequently used packages.
 | 
			
		||||
  apt:
 | 
			
		||||
    name:
 | 
			
		||||
      - vim
 | 
			
		||||
      - tmux
 | 
			
		||||
      - curl
 | 
			
		||||
      - htop
 | 
			
		||||
    state: present
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
- name: Install fail2ban.
 | 
			
		||||
  apt:
 | 
			
		||||
    name: fail2ban
 | 
			
		||||
    state: present
 | 
			
		||||
 | 
			
		||||
# TODO add proper fail2ban config
 | 
			
		||||
 | 
			
		||||
- name: Ensure fail2ban is started & enabled.
 | 
			
		||||
  service:
 | 
			
		||||
    name: fail2ban
 | 
			
		||||
    state: started
 | 
			
		||||
    enabled: true
 | 
			
		||||
 | 
			
		||||
# TODO install UFW
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
---
 | 
			
		||||
- name: deploy portainer
 | 
			
		||||
  shell: >
 | 
			
		||||
    docker stack deploy
 | 
			
		||||
    --compose-file /srv/portainer-stack.yml
 | 
			
		||||
    --prune
 | 
			
		||||
    portainer
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Create public network.
 | 
			
		||||
  shell:
 | 
			
		||||
    docker network create -d overlay public
 | 
			
		||||
  register: create_network
 | 
			
		||||
  failed_when: create_network.rc not in [ 0, 1 ]
 | 
			
		||||
  changed_when: create_network.rc == 0
 | 
			
		||||
 | 
			
		||||
- name: Copy over the Portainer stack file.
 | 
			
		||||
  template:
 | 
			
		||||
    src: portainer-stack.yml.j2
 | 
			
		||||
    dest: /srv/portainer-stack.yml
 | 
			
		||||
  notify: deploy portainer
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,49 @@
 | 
			
		|||
# vim: ft=yaml
 | 
			
		||||
version: '3'
 | 
			
		||||
 | 
			
		||||
services:
 | 
			
		||||
  app:
 | 
			
		||||
    image: 'portainer/portainer-ce:2.11.0-alpine'
 | 
			
		||||
    command: '-H tcp://tasks.agent:9001 --tlsskipverify'
 | 
			
		||||
 | 
			
		||||
    deploy:
 | 
			
		||||
      mode: replicated
 | 
			
		||||
      replicas: 1
 | 
			
		||||
      placement:
 | 
			
		||||
        constraints:
 | 
			
		||||
          - node.role == manager
 | 
			
		||||
      labels:
 | 
			
		||||
        - 'traefik.enable=true'
 | 
			
		||||
        - 'traefik.http.routers.portainer.rule=Host(`{{ portainer_domain }}`)'
 | 
			
		||||
        - 'traefik.http.routers.portainer.service=portainer'
 | 
			
		||||
        - 'traefik.http.services.portainer.loadbalancer.server.port=9000'
 | 
			
		||||
        - 'traefik.http.routers.portainer.tls=true'
 | 
			
		||||
        - 'traefik.http.routers.portainer.tls.certresolver=letsEncrypt'
 | 
			
		||||
 | 
			
		||||
    networks:
 | 
			
		||||
      - default
 | 
			
		||||
      - public
 | 
			
		||||
    volumes:
 | 
			
		||||
      - 'data:/data'
 | 
			
		||||
    ports:
 | 
			
		||||
      - '8000:8000'
 | 
			
		||||
 | 
			
		||||
  agent:
 | 
			
		||||
    image: 'portainer/agent:2.9.3-alpine'
 | 
			
		||||
 | 
			
		||||
    deploy:
 | 
			
		||||
      mode: global
 | 
			
		||||
      placement:
 | 
			
		||||
        constraints:
 | 
			
		||||
          - node.platform.os == linux
 | 
			
		||||
 | 
			
		||||
    volumes:
 | 
			
		||||
      - '/var/run/docker.sock:/var/run/docker.sock'
 | 
			
		||||
      - '/var/lib/docker/volumes:/var/lib/docker/volumes'
 | 
			
		||||
 | 
			
		||||
networks:
 | 
			
		||||
  public:
 | 
			
		||||
    external: true
 | 
			
		||||
 | 
			
		||||
volumes:
 | 
			
		||||
  data:
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Set hostname
 | 
			
		||||
  hostname:
 | 
			
		||||
    name: "{{ hostname }}"
 | 
			
		||||
    method: debian
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
---
 | 
			
		||||
- name: deploy traefik
 | 
			
		||||
  shell: >
 | 
			
		||||
    docker stack deploy
 | 
			
		||||
    --compose-file /srv/traefik-stack.yml
 | 
			
		||||
    --prune
 | 
			
		||||
    traefik
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Copy over config file.
 | 
			
		||||
  template:
 | 
			
		||||
    src: traefik.yml.j2
 | 
			
		||||
    dest: "srv/traefik.yml"
 | 
			
		||||
  notify: deploy treafik
 | 
			
		||||
 | 
			
		||||
- name: Copy over stack file.
 | 
			
		||||
  template:
 | 
			
		||||
    src: traefik-stack.yml.j2
 | 
			
		||||
    dest: /srv/traefik-stack.yml
 | 
			
		||||
  notify: deploy traefik
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
# vim: ft=yaml
 | 
			
		||||
version: '3'
 | 
			
		||||
 | 
			
		||||
services:
 | 
			
		||||
  app:
 | 
			
		||||
    image: 'traefik:2.5'
 | 
			
		||||
 | 
			
		||||
    deploy:
 | 
			
		||||
      mode: replicated
 | 
			
		||||
      replicas: 1
 | 
			
		||||
      placement:
 | 
			
		||||
        constraints:
 | 
			
		||||
          - node.role == manager
 | 
			
		||||
 | 
			
		||||
    networks:
 | 
			
		||||
      - public
 | 
			
		||||
    ports:
 | 
			
		||||
      - '80:80'
 | 
			
		||||
      - '443:443'
 | 
			
		||||
    volumes:
 | 
			
		||||
      - '/srv/traefik.yml:/etc/traefik/traefik.yml'
 | 
			
		||||
      - 'acme:/etc/traefik/acme'
 | 
			
		||||
      - '/var/run/docker.sock:/var/run/docker.sock'
 | 
			
		||||
 | 
			
		||||
networks:
 | 
			
		||||
  public:
 | 
			
		||||
    external: true
 | 
			
		||||
 | 
			
		||||
volumes:
 | 
			
		||||
  acme:
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,28 @@
 | 
			
		|||
# vim: ft=yaml
 | 
			
		||||
entryPoints:
 | 
			
		||||
  web:
 | 
			
		||||
    address: ":80"
 | 
			
		||||
    http:
 | 
			
		||||
      redirections:
 | 
			
		||||
        entryPoint:
 | 
			
		||||
          to: websecure
 | 
			
		||||
          scheme: https
 | 
			
		||||
  websecure:
 | 
			
		||||
    address: ":443"
 | 
			
		||||
 | 
			
		||||
api:
 | 
			
		||||
  insecure: true
 | 
			
		||||
 | 
			
		||||
providers:
 | 
			
		||||
  docker:
 | 
			
		||||
    swarmMode: true
 | 
			
		||||
    exposedbydefault: false
 | 
			
		||||
    network: public
 | 
			
		||||
 | 
			
		||||
certificatesResolvers:
 | 
			
		||||
  letsEncrypt:
 | 
			
		||||
    acme:
 | 
			
		||||
      email: "{{ letsencrypt_email }}"
 | 
			
		||||
      storage: "/etc/traefik/acme/acme.json"
 | 
			
		||||
      httpChallenge:
 | 
			
		||||
        entryPoint: web
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
deb http://deb.debian.org/debian bullseye main contrib non-free
 | 
			
		||||
deb-src http://deb.debian.org/debian bullseye main contrib non-free
 | 
			
		||||
 | 
			
		||||
deb http://deb.debian.org/debian-security/ bullseye-security main contrib non-free
 | 
			
		||||
deb-src http://deb.debian.org/debian-security/ bullseye-security main contrib non-free
 | 
			
		||||
 | 
			
		||||
deb http://deb.debian.org/debian bullseye-updates main contrib non-free
 | 
			
		||||
deb-src http://deb.debian.org/debian bullseye-updates main contrib non-free
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Copy over sources.list
 | 
			
		||||
  copy:
 | 
			
		||||
    src: sources.list
 | 
			
		||||
    dest: /etc/apt/sources.list
 | 
			
		||||
    owner: root
 | 
			
		||||
    group: root
 | 
			
		||||
    mode: '644'
 | 
			
		||||
 | 
			
		||||
- name: Update system
 | 
			
		||||
  apt:
 | 
			
		||||
    update_cache: yes
 | 
			
		||||
    install_recommends: yes
 | 
			
		||||
    upgrade: dist
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,121 @@
 | 
			
		|||
#	$OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $
 | 
			
		||||
 | 
			
		||||
# This is the sshd server system-wide configuration file.  See
 | 
			
		||||
# sshd_config(5) for more information.
 | 
			
		||||
 | 
			
		||||
# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
 | 
			
		||||
 | 
			
		||||
# The strategy used for options in the default sshd_config shipped with
 | 
			
		||||
# OpenSSH is to specify options with their default value where
 | 
			
		||||
# possible, but leave them commented.  Uncommented options override the
 | 
			
		||||
# default value.
 | 
			
		||||
 | 
			
		||||
#Port 22
 | 
			
		||||
#AddressFamily any
 | 
			
		||||
#ListenAddress 0.0.0.0
 | 
			
		||||
#ListenAddress ::
 | 
			
		||||
 | 
			
		||||
#HostKey /etc/ssh/ssh_host_rsa_key
 | 
			
		||||
#HostKey /etc/ssh/ssh_host_ecdsa_key
 | 
			
		||||
#HostKey /etc/ssh/ssh_host_ed25519_key
 | 
			
		||||
 | 
			
		||||
# Ciphers and keying
 | 
			
		||||
#RekeyLimit default none
 | 
			
		||||
 | 
			
		||||
# Logging
 | 
			
		||||
#SyslogFacility AUTH
 | 
			
		||||
#LogLevel INFO
 | 
			
		||||
 | 
			
		||||
# Authentication:
 | 
			
		||||
 | 
			
		||||
#LoginGraceTime 2m
 | 
			
		||||
PermitRootLogin yes
 | 
			
		||||
#StrictModes yes
 | 
			
		||||
#MaxAuthTries 6
 | 
			
		||||
#MaxSessions 10
 | 
			
		||||
 | 
			
		||||
PubkeyAuthentication yes
 | 
			
		||||
 | 
			
		||||
# Expect .ssh/authorized_keys2 to be disregarded by default in future.
 | 
			
		||||
#AuthorizedKeysFile	.ssh/authorized_keys .ssh/authorized_keys2
 | 
			
		||||
 | 
			
		||||
#AuthorizedPrincipalsFile none
 | 
			
		||||
 | 
			
		||||
#AuthorizedKeysCommand none
 | 
			
		||||
#AuthorizedKeysCommandUser nobody
 | 
			
		||||
 | 
			
		||||
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
 | 
			
		||||
#HostbasedAuthentication no
 | 
			
		||||
# Change to yes if you don't trust ~/.ssh/known_hosts for
 | 
			
		||||
# HostbasedAuthentication
 | 
			
		||||
#IgnoreUserKnownHosts no
 | 
			
		||||
# Don't read the user's ~/.rhosts and ~/.shosts files
 | 
			
		||||
#IgnoreRhosts yes
 | 
			
		||||
 | 
			
		||||
# To disable tunneled clear text passwords, change to no here!
 | 
			
		||||
#PasswordAuthentication yes
 | 
			
		||||
#PermitEmptyPasswords no
 | 
			
		||||
 | 
			
		||||
# Change to yes to enable challenge-response passwords (beware issues with
 | 
			
		||||
# some PAM modules and threads)
 | 
			
		||||
ChallengeResponseAuthentication no
 | 
			
		||||
 | 
			
		||||
# Kerberos options
 | 
			
		||||
#KerberosAuthentication no
 | 
			
		||||
#KerberosOrLocalPasswd yes
 | 
			
		||||
#KerberosTicketCleanup yes
 | 
			
		||||
#KerberosGetAFSToken no
 | 
			
		||||
 | 
			
		||||
# GSSAPI options
 | 
			
		||||
#GSSAPIAuthentication no
 | 
			
		||||
#GSSAPICleanupCredentials yes
 | 
			
		||||
#GSSAPIStrictAcceptorCheck yes
 | 
			
		||||
#GSSAPIKeyExchange no
 | 
			
		||||
 | 
			
		||||
# 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
 | 
			
		||||
 | 
			
		||||
#AllowAgentForwarding yes
 | 
			
		||||
#AllowTcpForwarding yes
 | 
			
		||||
#GatewayPorts no
 | 
			
		||||
X11Forwarding yes
 | 
			
		||||
#X11DisplayOffset 10
 | 
			
		||||
#X11UseLocalhost yes
 | 
			
		||||
#PermitTTY yes
 | 
			
		||||
PrintMotd no
 | 
			
		||||
#PrintLastLog yes
 | 
			
		||||
#TCPKeepAlive yes
 | 
			
		||||
#PermitUserEnvironment no
 | 
			
		||||
#Compression delayed
 | 
			
		||||
#ClientAliveInterval 0
 | 
			
		||||
#ClientAliveCountMax 3
 | 
			
		||||
#UseDNS no
 | 
			
		||||
#PidFile /var/run/sshd.pid
 | 
			
		||||
#MaxStartups 10:30:100
 | 
			
		||||
#PermitTunnel no
 | 
			
		||||
#ChrootDirectory none
 | 
			
		||||
#VersionAddendum none
 | 
			
		||||
 | 
			
		||||
# no default banner path
 | 
			
		||||
#Banner none
 | 
			
		||||
 | 
			
		||||
# Allow client to pass locale environment variables
 | 
			
		||||
AcceptEnv LANG LC_*
 | 
			
		||||
 | 
			
		||||
# override default of no subsystems
 | 
			
		||||
Subsystem	sftp	/usr/lib/openssh/sftp-server
 | 
			
		||||
 | 
			
		||||
# Example of overriding settings on a per-user basis
 | 
			
		||||
#Match User anoncvs
 | 
			
		||||
#	X11Forwarding no
 | 
			
		||||
#	AllowTcpForwarding no
 | 
			
		||||
#	PermitTTY no
 | 
			
		||||
#	ForceCommand cvs server
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
---
 | 
			
		||||
- name: Update system.
 | 
			
		||||
  hosts: all
 | 
			
		||||
  become: yes
 | 
			
		||||
  roles:
 | 
			
		||||
    - update
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,18 @@
 | 
			
		|||
# This file should only contain static IPs. Dynamic IPs should be defined in
 | 
			
		||||
# originals.ini.
 | 
			
		||||
 | 
			
		||||
# The admin is the main host that initializes the swarm
 | 
			
		||||
admin ansible_host=192.168.56.5
 | 
			
		||||
 | 
			
		||||
[managers]
 | 
			
		||||
 | 
			
		||||
[workers]
 | 
			
		||||
192.168.56.6
 | 
			
		||||
192.168.56.7
 | 
			
		||||
 | 
			
		||||
[all:vars]
 | 
			
		||||
ansible_ssh_user=debian
 | 
			
		||||
ansible_ssh_port=2222
 | 
			
		||||
ansible_become_pass=pass
 | 
			
		||||
; ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key
 | 
			
		||||
debian_pass=pass
 | 
			
		||||
		Loading…
	
		Reference in New Issue