Initial Lab Setup
This commit is contained in:
@@ -0,0 +1,290 @@
|
||||
---
|
||||
- name: Ensure Proxmox GPG key is present (for Raspberry Pi/PBS)
|
||||
ansible.builtin.get_url:
|
||||
url: https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg
|
||||
dest: /etc/apt/trusted.gpg.d/proxmox-release-trixie.gpg
|
||||
mode: '0644'
|
||||
become: yes
|
||||
when: ansible_distribution == 'Debian'
|
||||
tags: [setup]
|
||||
|
||||
- name: Set hostname
|
||||
ansible.builtin.hostname:
|
||||
name: "{{ inventory_hostname }}"
|
||||
become: yes
|
||||
tags: [identity]
|
||||
|
||||
- name: Update /etc/hosts for FQDN resolution
|
||||
ansible.builtin.lineinfile:
|
||||
path: /etc/hosts
|
||||
regexp: '^127\.0\.1\.1'
|
||||
line: "127.0.1.1 {{ inventory_hostname }}.{{ domain_name }} {{ inventory_hostname }}"
|
||||
become: yes
|
||||
tags: [identity]
|
||||
|
||||
- name: Check for NetworkManager
|
||||
ansible.builtin.command: systemctl is-active NetworkManager
|
||||
register: nm_status
|
||||
failed_when: false
|
||||
changed_when: false
|
||||
tags: [identity, network]
|
||||
|
||||
- name: Configure NetworkManager Search Domain (Raspberry Pi/mDNS Style)
|
||||
when:
|
||||
- nm_status.rc == 0
|
||||
- ansible_virtualization_type != 'lxc' # <-- NEU: Überspringe LXC
|
||||
tags: [identity, network]
|
||||
block:
|
||||
- name: Get active connection name
|
||||
ansible.builtin.shell: "nmcli -t -f NAME connection show --active | head -n 1"
|
||||
register: active_conn
|
||||
changed_when: false
|
||||
- name: Apply search domain via nmcli
|
||||
ansible.builtin.command: "nmcli connection modify '{{ active_conn.stdout }}' ipv4.dns-search '{{ domain_name }}'"
|
||||
when: active_conn.stdout != ""
|
||||
notify: Reload NetworkManager
|
||||
|
||||
- name: Configure systemd-resolved Search Domain (Vanilla Debian Style)
|
||||
ansible.builtin.ini_file:
|
||||
path: /etc/systemd/resolved.conf
|
||||
section: Resolve
|
||||
option: Domains
|
||||
value: "{{ domain_name }}"
|
||||
become: yes
|
||||
notify: Restart systemd-resolved
|
||||
when:
|
||||
- nm_status.rc != 0
|
||||
- ansible_virtualization_type != 'lxc' # <-- NEU: Überspringe LXC
|
||||
tags: [identity, network]
|
||||
|
||||
- name: Ensure the terminal is always functional
|
||||
ansible.builtin.lineinfile:
|
||||
path: /etc/profile
|
||||
line: 'export TERM=xterm-256color'
|
||||
state: present
|
||||
become: yes
|
||||
|
||||
- name: Set system timezone
|
||||
community.general.timezone:
|
||||
name: Europe/Berlin
|
||||
become: yes
|
||||
tags: [localization]
|
||||
|
||||
- name: Generate required locales
|
||||
ansible.builtin.locale_gen:
|
||||
name: "{{ item }}"
|
||||
state: present
|
||||
become: yes
|
||||
loop:
|
||||
- en_US.UTF-8
|
||||
- en_DK.UTF-8 # Required for the 24h clock format
|
||||
tags: [localization]
|
||||
|
||||
- name: Force system-wide locale and 24h clock
|
||||
ansible.builtin.command: update-locale LANG=en_US.UTF-8 LC_TIME=en_DK.UTF-8
|
||||
become: yes
|
||||
changed_when: true
|
||||
tags: [localization]
|
||||
|
||||
- name: Flush handlers to apply DNS changes immediately
|
||||
ansible.builtin.meta: flush_handlers
|
||||
|
||||
- name: Wait for DNS to be functional
|
||||
ansible.builtin.command: getent hosts google.com
|
||||
register: dns_check
|
||||
until: dns_check.rc == 0
|
||||
retries: 3
|
||||
delay: 5
|
||||
changed_when: false
|
||||
when: ansible_virtualization_type != 'lxc' # <-- NEU: Überspringe LXC
|
||||
tags: [identity, network]
|
||||
|
||||
# --- REINE PACKET-TASKS OHNE SECURITY ---
|
||||
|
||||
- name: Install baseline packages (Unified list from group_vars)
|
||||
ansible.builtin.apt:
|
||||
name: "{{ common_packages }}"
|
||||
state: present
|
||||
update_cache: yes
|
||||
cache_valid_time: 3600
|
||||
become: yes
|
||||
tags: [packages]
|
||||
|
||||
- name: Install modern packages like fastfetch (Debian 13+ only)
|
||||
ansible.builtin.apt:
|
||||
name: "{{ modern_os_packages | default(['fastfetch']) }}"
|
||||
state: present
|
||||
become: yes
|
||||
when:
|
||||
- ansible_os_family == "Debian"
|
||||
- ansible_distribution_major_version | int >= 13
|
||||
tags: [packages]
|
||||
|
||||
- name: Install QEMU Guest Agent (VMs only - NOT on LXC or Physical Iron)
|
||||
ansible.builtin.apt:
|
||||
name: qemu-guest-agent
|
||||
state: present
|
||||
become: yes
|
||||
when:
|
||||
- "'proxmox_vms' in group_names"
|
||||
- "'lxc_containers' not in group_names"
|
||||
- "'physical_iron' not in group_names"
|
||||
tags: [packages, proxmox]
|
||||
|
||||
# --- SYSTEM-EINSTELLUNGEN & DIENSTE ---
|
||||
|
||||
- name: Configure needrestart for non-interactive automation
|
||||
ansible.builtin.lineinfile:
|
||||
path: /etc/needrestart/needrestart.conf
|
||||
regexp: '^#?\$nrconf{restart}'
|
||||
line: "$nrconf{restart} = 'a';"
|
||||
become: yes
|
||||
tags: [packages, config]
|
||||
|
||||
- name: Ensure discovery services are enabled and running
|
||||
ansible.builtin.service:
|
||||
name: "{{ item }}"
|
||||
state: started
|
||||
enabled: yes
|
||||
loop:
|
||||
- avahi-daemon
|
||||
- lldpd
|
||||
become: yes
|
||||
tags: [services]
|
||||
|
||||
- name: Include maintenance tasks
|
||||
ansible.builtin.include_tasks: maintenance.yml
|
||||
tags: [maintenance]
|
||||
|
||||
- name: Ensure console getty is running (for Proxmox WebUI access)
|
||||
ansible.builtin.systemd:
|
||||
name: getty@tty1.service
|
||||
state: started
|
||||
enabled: yes
|
||||
become: yes
|
||||
tags: [services, setup]
|
||||
|
||||
- name: Ensure Node Exporter is running for monitoring
|
||||
ansible.builtin.systemd:
|
||||
name: prometheus-node-exporter
|
||||
state: started
|
||||
enabled: yes
|
||||
become: yes
|
||||
tags: [monitoring, services]
|
||||
|
||||
- name: Fix Vim mouse behavior for easy copy-paste
|
||||
ansible.builtin.copy:
|
||||
dest: /etc/vim/vimrc.local
|
||||
content: |
|
||||
set mouse=
|
||||
syntax on
|
||||
set number
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0644'
|
||||
become: yes
|
||||
### ghosty shit shizzle
|
||||
|
||||
- name: Create Ghostty terminfo source file on remote
|
||||
ansible.builtin.copy:
|
||||
content: |
|
||||
{% raw %}
|
||||
xterm-ghostty|ghostty|Ghostty,
|
||||
am, bce, ccc, hs, km, mc5i, mir, msgr, npc, xenl, AX, Su, Tc, XT, fullkbd,
|
||||
colors#256, cols#80, it#8, lines#24, pairs#32767,
|
||||
acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
|
||||
bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
|
||||
clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=^M,
|
||||
csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
|
||||
cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C,
|
||||
cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
|
||||
cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
|
||||
dl=\E[%p1%dM, dl1=\E[M, dsl=\E]2;\007, ech=\E[%p1%dX,
|
||||
ed=\E[J, el=\E[K, el1=\E[1K, flash=\E[?5h$<100/>\E[?5l,
|
||||
fsl=^G, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH,
|
||||
ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=^J,
|
||||
indn=\E[%p1%dS,
|
||||
initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\,
|
||||
invis=\E[8m, kDC=\E[3;2~, kEND=\E[1;2F, kHOM=\E[1;2H,
|
||||
kIC=\E[2;2~, kLFT=\E[1;2D, kNXT=\E[6;2~, kPRV=\E[5;2~,
|
||||
kRIT=\E[1;2C, kbs=\177, kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB,
|
||||
kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, kend=\EOF, kent=\EOM,
|
||||
kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~,
|
||||
kf13=\E[1;2P, kf14=\E[1;2Q, kf15=\E[1;2R, kf16=\E[1;2S,
|
||||
kf17=\E[15;2~, kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ,
|
||||
kf20=\E[19;2~, kf21=\E[20;2~, kf22=\E[21;2~,
|
||||
kf23=\E[23;2~, kf24=\E[24;2~, kf25=\E[1;5P, kf26=\E[1;5Q,
|
||||
kf27=\E[1;5R, kf28=\E[1;5S, kf29=\E[15;5~, kf3=\EOR,
|
||||
kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~,
|
||||
kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~,
|
||||
kf36=\E[24;5~, kf37=\E[1;6P, kf38=\E[1;6Q, kf39=\E[1;6R,
|
||||
kf4=\EOS, kf40=\E[1;6S, kf41=\E[15;6~, kf42=\E[17;6~,
|
||||
kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~,
|
||||
kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~,
|
||||
kf49=\E[1;3P, kf5=\E[15~, kf50=\E[1;3Q, kf51=\E[1;3R,
|
||||
kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~,
|
||||
kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~,
|
||||
kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~,
|
||||
kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, kf7=\E[18~,
|
||||
kf8=\E[19~, kf9=\E[20~, khome=\EOH, kich1=\E[2~,
|
||||
kind=\E[1;2B, kmous=\E[<, knp=\E[6~, kpp=\E[5~,
|
||||
kri=\E[1;2A, oc=\E]104\007, op=\E[39;49m, rc=\E8,
|
||||
rep=%p1%c\E[%p2%{1}%-%db, rev=\E[7m, ri=\EM,
|
||||
rin=\E[%p1%dT, ritm=\E[23m, rmacs=\E(B, rmam=\E[?7l,
|
||||
rmcup=\E[?1049l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m,
|
||||
rmul=\E[24m, rs1=\E]\E\\\Ec, sc=\E7,
|
||||
setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
|
||||
setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
|
||||
sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
|
||||
sgr0=\E(B\E[m, sitm=\E[3m, smacs=\E(0, smam=\E[?7h,
|
||||
smcup=\E[?1049h, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m,
|
||||
smul=\E[4m, tbc=\E[3g, tsl=\E]2;, u6=\E[%i%d;%dR, u7=\E[6n,
|
||||
u8=\E[?%[;0123456789]c, u9=\E[c, vpa=\E[%i%p1%dd,
|
||||
BD=\E[?2004l, BE=\E[?2004h, Clmg=\E[s,
|
||||
Cmg=\E[%i%p1%d;%p2%ds, Dsmg=\E[?69l, E3=\E[3J,
|
||||
Enmg=\E[?69h, Ms=\E]52;%p1%s;%p2%s\007, PE=\E[201~,
|
||||
PS=\E[200~, RV=\E[>c, Se=\E[2 q,
|
||||
Setulc=\E[58\:2\:\:%p1%{65536}%/%d\:%p1%{256}%/%{255}%&%d\:%p1%{255}%&%d%;m,
|
||||
Smulx=\E[4\:%p1%dm, Ss=\E[%p1%d q,
|
||||
Sync=\E[?2026%?%p1%{1}%-%tl%eh%;,
|
||||
XM=\E[?1006;1000%?%p1%{1}%=%th%el%;, XR=\E[>0q,
|
||||
fd=\E[?1004l, fe=\E[?1004h, kDC3=\E[3;3~, kDC4=\E[3;4~,
|
||||
kDC5=\E[3;5~, kDC6=\E[3;6~, kDC7=\E[3;7~, kDN=\E[1;2B,
|
||||
kDN3=\E[1;3B, kDN4=\E[1;4B, kDN5=\E[1;5B, kDN6=\E[1;6B,
|
||||
kDN7=\E[1;7B, kEND3=\E[1;3F, kEND4=\E[1;4F,
|
||||
kEND5=\E[1;5F, kEND6=\E[1;6F, kEND7=\E[1;7F,
|
||||
kHOM3=\E[1;3H, kHOM4=\E[1;4H, kHOM5=\E[1;5H,
|
||||
kHOM6=\E[1;6H, kHOM7=\E[1;7H, kIC3=\E[2;3~, kIC4=\E[2;4~,
|
||||
kIC5=\E[2;5~, kIC6=\E[2;6~, kIC7=\E[2;7~, kLFT3=\E[1;3D,
|
||||
kLFT4=\E[1;4D, kLFT5=\E[1;5D, kLFT6=\E[1;6D,
|
||||
kLFT7=\E[1;7D, kNXT3=\E[6;3~, kNXT4=\E[6;4~,
|
||||
kNXT5=\E[6;5~, kNXT6=\E[6;6~, kNXT7=\E[6;7~,
|
||||
kPRV3=\E[5;3~, kPRV4=\E[5;4~, kPRV5=\E[5;5~,
|
||||
kPRV6=\E[5;6~, kPRV7=\E[5;7~, kRIT3=\E[1;3C,
|
||||
kRIT4=\E[1;4C, kRIT5=\E[1;5C, kRIT6=\E[1;6C,
|
||||
kRIT7=\E[1;7C, kUP=\E[1;2A, kUP3=\E[1;3A, kUP4=\E[1;4A,
|
||||
kUP5=\E[1;5A, kUP6=\E[1;6A, kUP7=\E[1;7A, kxIN=\E[I,
|
||||
kxOUT=\E[O, rmxx=\E[29m, rv=\E\\[[0-9]+;[0-9]+;[0-9]+c,
|
||||
setrgbb=\E[48\:2\:%p1%d\:%p2%d\:%p3%dm,
|
||||
setrgbf=\E[38\:2\:%p1%d\:%p2%d\:%p3%dm, smxx=\E[9m,
|
||||
xm=\E[<%i%p3%d;%p1%d;%p2%d;%?%p4%tM%em%;,
|
||||
xr=\EP>\\|[ -~]+a\E\\,
|
||||
{% endraw %}
|
||||
dest: /tmp/xterm-ghostty
|
||||
mode: '0644'
|
||||
ignore_errors: yes
|
||||
tags: [common, terminal]
|
||||
|
||||
- name: Optimize terminfo for Ghostty terminal
|
||||
ansible.builtin.command: tic -x /tmp/xterm-ghostty
|
||||
become: yes
|
||||
changed_when: false
|
||||
ignore_errors: yes
|
||||
tags: [common, terminal]
|
||||
|
||||
- name: Clean up temporary Ghostty terminfo file
|
||||
ansible.builtin.file:
|
||||
path: /tmp/xterm-ghostty
|
||||
state: absent
|
||||
ignore_errors: yes
|
||||
tags: [common, terminal]
|
||||
Reference in New Issue
Block a user