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