Initial commit: VM Creation done
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
---
|
||||
- name: Update apt cache
|
||||
ansible.builtin.apt:
|
||||
update_cache: yes
|
||||
|
||||
- name: Install essential packages
|
||||
ansible.builtin.apt:
|
||||
name:
|
||||
- sudo
|
||||
- vim
|
||||
- curl
|
||||
- git
|
||||
- software-properties-common
|
||||
state: present
|
||||
|
||||
- name: Ensure user is in docker group
|
||||
ansible.builtin.user:
|
||||
name: "{{ ansible_user }}"
|
||||
groups: docker
|
||||
append: yes
|
||||
@@ -0,0 +1,11 @@
|
||||
---
|
||||
- name: Install Docker & Compose
|
||||
ansible.builtin.apt:
|
||||
name: "{{ docker_packages }}"
|
||||
state: present
|
||||
|
||||
- name: Ensure Docker service is started
|
||||
ansible.builtin.service:
|
||||
name: docker
|
||||
state: started
|
||||
enabled: yes
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
- name: restart keepalived
|
||||
systemd:
|
||||
name: keepalived
|
||||
state: restarted
|
||||
@@ -0,0 +1,19 @@
|
||||
---
|
||||
- name: Install keepalived
|
||||
apt:
|
||||
name: keepalived
|
||||
state: present
|
||||
update_cache: yes
|
||||
|
||||
- name: Create keepalived config
|
||||
template:
|
||||
src: keepalived.conf.j2
|
||||
dest: /etc/keepalived/keepalived.conf
|
||||
mode: '0644'
|
||||
notify: restart keepalived
|
||||
|
||||
- name: Enable and start keepalived
|
||||
systemd:
|
||||
name: keepalived
|
||||
enabled: yes
|
||||
state: started
|
||||
@@ -0,0 +1,16 @@
|
||||
vrrp_instance VI_1 {
|
||||
state {{ keepalived_state | default('MASTER') }}
|
||||
interface {{ keepalived_interface | default('eth0') }}
|
||||
virtual_router_id {{ keepalived_router_id | default('51') }}
|
||||
priority {{ keepalived_priority | default('100') }}
|
||||
advert_int 1
|
||||
|
||||
authentication {
|
||||
auth_type PASS
|
||||
auth_pass {{ keepalived_password | default('secret') }}
|
||||
}
|
||||
|
||||
virtual_ipaddress {
|
||||
{{ keepalived_vip }}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
- name: Install Komodo agent
|
||||
ansible.builtin.shell: |
|
||||
curl -sSL https://komodo.install/script.sh | bash
|
||||
args:
|
||||
creates: /usr/local/bin/komodo
|
||||
@@ -0,0 +1,11 @@
|
||||
- name: Resize disk
|
||||
community.proxmox.proxmox_disk:
|
||||
api_host: "{{ proxmox_api_host }}"
|
||||
api_user: "{{ proxmox_api_user }}"
|
||||
api_token_id: "{{ proxmox_api_token_id }}"
|
||||
api_token_secret: "{{ proxmox_api_token_secret }}"
|
||||
vmid: "{{ item.value.vmid }}"
|
||||
disk: scsi0
|
||||
size: "{{ item.value.disk }}"
|
||||
state: resized
|
||||
loop: "{{ vms | dict2items }}"
|
||||
@@ -0,0 +1,5 @@
|
||||
- name: Enable iGPU passthrough (media VM)
|
||||
ansible.builtin.shell: |
|
||||
qm set {{ item.value.vmid }} -hostpci0 00:02.0
|
||||
when: item.value.igpu is defined and item.value.igpu
|
||||
loop: "{{ vms | dict2items }}"
|
||||
@@ -0,0 +1,53 @@
|
||||
---
|
||||
- name: Clone VM from template
|
||||
community.proxmox.proxmox_kvm:
|
||||
api_host: "{{ proxmox_api_host }}"
|
||||
api_user: "{{ proxmox_api_user }}"
|
||||
api_token_id: "{{ proxmox_api_token_id }}"
|
||||
api_token_secret: "{{ proxmox_api_token_secret }}"
|
||||
node: "{{ item.value.node }}"
|
||||
clone: "debian-13-cloudinit"
|
||||
vmid: "{{ item.value.template_vmid }}"
|
||||
newid: "{{ item.value.vmid }}"
|
||||
storage: "{{ item.value.storage }}"
|
||||
name: "{{ item.key }}"
|
||||
full: yes
|
||||
loop: "{{ vms | dict2items }}"
|
||||
|
||||
- name: Configure VM hardware and cloud-init
|
||||
community.proxmox.proxmox_kvm:
|
||||
api_host: "{{ proxmox_api_host }}"
|
||||
api_user: "{{ proxmox_api_user }}"
|
||||
api_token_id: "{{ proxmox_api_token_id }}"
|
||||
api_token_secret: "{{ proxmox_api_token_secret }}"
|
||||
node: "{{ item.value.node }}"
|
||||
vmid: "{{ item.value.vmid }}"
|
||||
cores: "{{ item.value.cores }}"
|
||||
memory: "{{ item.value.memory }}"
|
||||
scsihw: virtio-scsi-pci
|
||||
net:
|
||||
net0: "virtio,bridge={{ item.value.network_bridge }}"
|
||||
ipconfig:
|
||||
ipconfig0: "ip={{ item.value.ip }}/24,gw=10.0.0.1"
|
||||
nameservers: "10.0.2.49 10.0.2.50 10.0.2.51"
|
||||
ciuser: "{{ ansible_user }}"
|
||||
sshkeys: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}"
|
||||
update: yes
|
||||
loop: "{{ vms | dict2items }}"
|
||||
|
||||
- name: Wait for clone to complete
|
||||
pause:
|
||||
seconds: 10
|
||||
|
||||
- include_tasks: disk.yml
|
||||
|
||||
- include_tasks: start.yml
|
||||
|
||||
- name: Wait for VMs to be ready
|
||||
wait_for:
|
||||
host: "{{ item.value.ip }}"
|
||||
port: 22
|
||||
delay: 10
|
||||
timeout: 300
|
||||
loop: "{{ vms | dict2items }}"
|
||||
delegate_to: localhost
|
||||
@@ -0,0 +1,9 @@
|
||||
- name: Start VMs
|
||||
community.proxmox.proxmox_kvm:
|
||||
api_host: "{{ proxmox_api_host }}"
|
||||
api_user: "{{ proxmox_api_user }}"
|
||||
api_token_id: "{{ proxmox_api_token_id }}"
|
||||
api_token_secret: "{{ proxmox_api_token_secret }}"
|
||||
vmid: "{{ item.value.vmid }}"
|
||||
state: started
|
||||
loop: "{{ vms | dict2items }}"
|
||||
@@ -0,0 +1,39 @@
|
||||
---
|
||||
- name: Create traefik directory
|
||||
file:
|
||||
path: /opt/traefik
|
||||
state: directory
|
||||
mode: '0755'
|
||||
|
||||
- name: Create traefik data directory
|
||||
file:
|
||||
path: /opt/traefik/data
|
||||
state: directory
|
||||
mode: '0755'
|
||||
|
||||
- name: Create proxy network
|
||||
docker_network:
|
||||
name: proxy
|
||||
|
||||
- name: Create acme.json for Let's Encrypt
|
||||
file:
|
||||
path: /opt/traefik/data/acme.json
|
||||
state: touch
|
||||
mode: '0600'
|
||||
|
||||
- name: Create traefik config file
|
||||
template:
|
||||
src: traefik.yml.j2
|
||||
dest: /opt/traefik/data/traefik.yml
|
||||
mode: '0644'
|
||||
|
||||
- name: Create docker-compose file
|
||||
template:
|
||||
src: docker-compose.yml.j2
|
||||
dest: /opt/traefik/docker-compose.yml
|
||||
mode: '0644'
|
||||
|
||||
- name: Start Traefik
|
||||
community.docker.docker_compose_v2:
|
||||
project_src: /opt/traefik
|
||||
state: present
|
||||
@@ -0,0 +1,36 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
traefik:
|
||||
image: traefik:v3.0
|
||||
container_name: traefik
|
||||
restart: unless-stopped
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
networks:
|
||||
- proxy
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
- "8080:8080" # Dashboard
|
||||
volumes:
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
- ./data/traefik.yml:/traefik.yml:ro
|
||||
- ./data/acme.json:/acme.json
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.traefik.entrypoints=http"
|
||||
- "traefik.http.routers.traefik.rule=Host(`traefik.{{ domain | default('local') }}`)"
|
||||
- "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
|
||||
- "traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https"
|
||||
- "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
|
||||
- "traefik.http.routers.traefik-secure.entrypoints=https"
|
||||
- "traefik.http.routers.traefik-secure.rule=Host(`traefik.{{ domain | default('local') }}`)"
|
||||
- "traefik.http.routers.traefik-secure.tls=true"
|
||||
- "traefik.http.routers.traefik-secure.tls.certresolver=cloudflare"
|
||||
- "traefik.http.routers.traefik-secure.service=api@internal"
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
external: true
|
||||
@@ -0,0 +1,33 @@
|
||||
api:
|
||||
dashboard: true
|
||||
debug: true
|
||||
|
||||
entryPoints:
|
||||
http:
|
||||
address: ":80"
|
||||
http:
|
||||
redirections:
|
||||
entryPoint:
|
||||
to: https
|
||||
scheme: https
|
||||
https:
|
||||
address: ":443"
|
||||
|
||||
serversTransport:
|
||||
insecureSkipVerify: true
|
||||
|
||||
providers:
|
||||
docker:
|
||||
endpoint: "unix:///var/run/docker.sock"
|
||||
exposedByDefault: false
|
||||
|
||||
certificatesResolvers:
|
||||
cloudflare:
|
||||
acme:
|
||||
email: {{ letsencrypt_email | default('admin@example.com') }}
|
||||
storage: acme.json
|
||||
dnsChallenge:
|
||||
provider: cloudflare
|
||||
resolvers:
|
||||
- "1.1.1.1:53"
|
||||
- "1.0.0.1:53"
|
||||
@@ -0,0 +1,11 @@
|
||||
---
|
||||
- name: Create app directories
|
||||
ansible.builtin.file:
|
||||
path: "/data/{{ item }}"
|
||||
state: directory
|
||||
mode: '0755'
|
||||
loop:
|
||||
- paperless
|
||||
- nextcloud
|
||||
- mealie
|
||||
- outline
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
- name: Create infra directories
|
||||
ansible.builtin.file:
|
||||
path: "/data/{{ item }}"
|
||||
state: directory
|
||||
mode: '0755'
|
||||
loop:
|
||||
- vaultwarden
|
||||
- pi-hole
|
||||
- uptime-kuma
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
- name: Ensure VM has iGPU passthrough (requires Proxmox pre-config)
|
||||
ansible.builtin.debug:
|
||||
msg: "Ensure /dev/dri is passed through on this VM: {{ inventory_hostname }}"
|
||||
|
||||
- name: Mount media storage
|
||||
ansible.builtin.file:
|
||||
path: /data/media
|
||||
state: directory
|
||||
mode: '0755'
|
||||
Reference in New Issue
Block a user