infra/ansible/roles/netbox/tasks/main.yml
Graham McIntire fb5803c866
add FreeBSD bootstrap, irc servers, hostname overrides, and cleanups
- bootstrap.yml: support pkg for FreeBSD sudo/python3 install
- base role: FreeBSD package sets, sudoers paths, host key regen, admin group, usermod process-in-use tolerance
- freebsd role: pkg update/upgrade tasks
- general role: standalone hostname tasks (ungated from network.skip), hostname_override support
- inspircd role: deploy configs for ca/us manero.org irc servers with vault-backed secrets
- uisp role: download and run installer on fresh hosts, skip if already running
- netbox role: stop services before usermod to avoid process-in-use failures
- hosts: add irc_servers group, ca/us.manero.org (Tailscale), drop staging.towerops.net
- all.yml: graham user gets static ed25519 key alongside github keys
2026-06-19 17:19:29 -05:00

209 lines
5.7 KiB
YAML

---
# Bare-metal NetBox install (mirrors live netbox.vntx.net layout). Runs:
# 1. system packages
# 2. netbox user/group
# 3. PostgreSQL role + database
# 4. Redis (default config; just ensure running)
# 5. Fetch + extract release tarball into {{ netbox_install_dir }}
# 6. Run upgrade.sh (creates venv, installs deps, runs migrate + collectstatic)
# 7. Render configuration.py + gunicorn.py
# 8. Render systemd units (netbox + netbox-rq)
# 9. Render per-host Caddyfile (the caddy role's host-specific template hook)
- name: Assert required secrets are present
ansible.builtin.assert:
that:
- netbox_secret_key is defined and netbox_secret_key | length >= 50
- netbox_db_password is defined and netbox_db_password | length > 0
fail_msg: >-
netbox_secret_key (>= 50 chars) and netbox_db_password must be set in
host_vars / ansible-vault before this role can run. See
ansible/roles/netbox/README.md.
- name: Install system packages
ansible.builtin.apt:
name: "{{ netbox_system_packages }}"
state: present
update_cache: true
- name: Ensure PostgreSQL is started and enabled
ansible.builtin.systemd:
name: postgresql
state: started
enabled: true
- name: Ensure Redis is started and enabled
ansible.builtin.systemd:
name: redis-server
state: started
enabled: true
- name: Stop netbox services before user/group changes
ansible.builtin.systemd:
name: "{{ item }}"
state: stopped
loop:
- netbox
- netbox-rq
failed_when: false
- name: Create netbox group
ansible.builtin.group:
name: "{{ netbox_group }}"
system: true
state: present
- name: Create netbox user
ansible.builtin.user:
name: "{{ netbox_user }}"
group: "{{ netbox_group }}"
system: true
shell: /usr/sbin/nologin
home: "{{ netbox_install_dir }}"
create_home: false
state: present
- name: Create PostgreSQL role
community.postgresql.postgresql_user:
name: "{{ netbox_db_user }}"
password: "{{ netbox_db_password }}"
state: present
become: true
become_user: postgres
- name: Create NetBox database
community.postgresql.postgresql_db:
name: "{{ netbox_db_name }}"
owner: "{{ netbox_db_user }}"
encoding: UTF-8
state: present
become: true
become_user: postgres
- name: Check installed NetBox version
ansible.builtin.slurp:
src: "{{ netbox_install_dir }}/netbox/release.yaml"
register: netbox_release_file
failed_when: false
changed_when: false
- name: Set installed-version fact
ansible.builtin.set_fact:
netbox_installed_version: >-
{{
(netbox_release_file.content | b64decode
| regex_search('version:\s*"?([0-9.]+)"?', '\1')
| first)
if netbox_release_file is defined and netbox_release_file.content is defined
else ''
}}
- name: Decide whether NetBox needs (re)install
ansible.builtin.set_fact:
netbox_needs_install: "{{ netbox_installed_version != netbox_version }}"
- name: Download NetBox release tarball
ansible.builtin.get_url:
url: "{{ netbox_release_url }}"
dest: "/tmp/netbox-{{ netbox_version }}.tar.gz"
mode: "0644"
when: netbox_needs_install
- name: Extract NetBox release into a versioned directory
ansible.builtin.unarchive:
src: "/tmp/netbox-{{ netbox_version }}.tar.gz"
dest: /opt
remote_src: true
creates: "/opt/netbox-{{ netbox_version }}"
when: netbox_needs_install
- name: Symlink {{ netbox_install_dir }} -> /opt/netbox-{{ netbox_version }}
ansible.builtin.file:
src: "/opt/netbox-{{ netbox_version }}"
dest: "{{ netbox_install_dir }}"
state: link
force: true
when: netbox_needs_install
notify:
- Restart netbox
- Restart netbox-rq
- name: Ensure netbox owns mutable subdirs
ansible.builtin.file:
path: "{{ netbox_install_dir }}/netbox/{{ item }}"
state: directory
owner: "{{ netbox_user }}"
group: "{{ netbox_group }}"
mode: "0755"
loop:
- media
- reports
- scripts
- static
- name: Render local_requirements.txt (plugin Python deps)
ansible.builtin.copy:
dest: "{{ netbox_install_dir }}/local_requirements.txt"
content: "{{ netbox_local_requirements | join('\n') }}\n"
owner: root
group: root
mode: "0644"
notify:
- Restart netbox
- Restart netbox-rq
- name: Render configuration.py
ansible.builtin.template:
src: configuration.py.j2
dest: "{{ netbox_install_dir }}/netbox/netbox/configuration.py"
owner: root
group: "{{ netbox_group }}"
mode: "0640"
notify:
- Restart netbox
- Restart netbox-rq
- name: Render gunicorn.py
ansible.builtin.template:
src: gunicorn.py.j2
dest: "{{ netbox_install_dir }}/gunicorn.py"
owner: "{{ netbox_user }}"
group: "{{ netbox_group }}"
mode: "0644"
notify: Restart netbox
- name: Run NetBox upgrade.sh (creates venv, installs deps, migrates DB, collectstatic)
ansible.builtin.command: "{{ netbox_install_dir }}/upgrade.sh"
args:
chdir: "{{ netbox_install_dir }}"
register: netbox_upgrade
when: netbox_needs_install
changed_when: netbox_upgrade.rc == 0
- name: Render netbox systemd unit
ansible.builtin.template:
src: netbox.service.j2
dest: /etc/systemd/system/netbox.service
owner: root
group: root
mode: "0644"
notify: Restart netbox
- name: Render netbox-rq systemd unit
ansible.builtin.template:
src: netbox-rq.service.j2
dest: /etc/systemd/system/netbox-rq.service
owner: root
group: root
mode: "0644"
notify: Restart netbox-rq
- name: Enable and start NetBox services
ansible.builtin.systemd:
name: "{{ item }}"
enabled: true
state: started
daemon_reload: true
loop:
- netbox
- netbox-rq