- name: Detect system architecture shell: "echo $(uname -m)/$(uname -p)" register: _arch_result changed_when: false - name: Set arch fact set_fact: arch: "{{ _arch_result.stdout }}" - name: Detect FreeBSD version shell: "uname -r" register: _freebsd_version_result changed_when: false - name: Set FreeBSD version fact set_fact: poudriere_freebsd_version: "{{ _freebsd_version_result.stdout }}" - name: Disable resolvconf copy: content: "resolvconf=NO\n" dest: /etc/resolvconf.conf owner: root group: wheel mode: "0644" - name: Set up resolv.conf template: src: etc_resolv.conf.j2 dest: /etc/resolv.conf owner: root group: wheel mode: "0644" - name: Install packages package: name: "{{ pkg_name }}" state: present loop: - rsync - dma - jq - curl - bash - git - python312 - py312-pip - py312-setuptools - py312-build - py312-installer - py312-wheel - python - fastfetch - vim - age - netdata - fd-find - poudriere loop_control: loop_var: pkg_name - name: Set up sshd template: src: etc_ssh_sshd_config.j2 dest: /etc/ssh/sshd_config owner: root group: wheel mode: "0644" notify: Restart sshd - name: Start sshd service: name: sshd state: started - name: Start syslogd service: name: syslogd state: started - name: Start auditd service: name: auditd state: started - name: Set up periodic.conf template: src: etc_periodic.conf.j2 dest: /etc/periodic.conf owner: root group: wheel mode: "0644" - name: Install .bashrc copy: src: root_bashrc dest: /root/.bashrc owner: root group: wheel mode: "0644" # Jail infrastructure # Ports tree management - name: Deploy update-ports script template: src: usr_local_bin_update_ports.sh.j2 dest: /usr/local/bin/update-ports owner: root group: wheel mode: "0755" - name: Deploy poudriere-start-build script template: src: usr_local_bin_poudriere_start_build.sh.j2 dest: /usr/local/bin/poudriere-start-build owner: root group: wheel mode: "0755" - name: Check if quarterly ports tree exists stat: path: /usr/ports/quarterly/Mk register: _quarterly_exists - name: Download quarterly ports tree shell: /usr/local/bin/update-ports quarterly when: not _quarterly_exists.stat.exists - name: Check if custom ports overlay exists shell: "ls /usr/ports/custom/ 2>/dev/null | head -1" register: _custom_exists changed_when: false - name: Download custom ports overlay shell: /usr/local/bin/update-ports custom when: _custom_exists.stdout == "" # Poudriere setup - name: Deploy poudriere.conf template: src: usr_local_etc_poudriere.conf.j2 dest: /usr/local/etc/poudriere.conf owner: root group: wheel mode: "0644" vars: pkg_abi: "FreeBSD:{{ poudriere_freebsd_version.split('.')[0] }}:{{ arch.split('/')[1] }}" - name: Create distfiles directory file: path: /usr/local/poudriere/distfiles state: directory owner: root group: wheel mode: "0755" - name: Check if poudriere jail exists shell: poudriere jail -l -n | grep -q "^poudriere_build$" failed_when: false changed_when: false register: _poudriere_jail_exists - name: Create poudriere jail shell: poudriere jail -c -j poudriere_build -v {{ poudriere_freebsd_version }} -m tar=/usr/local/jails/media/{{ poudriere_freebsd_version }}-base.txz when: _poudriere_jail_exists.rc != 0 - name: Check if poudriere quarterly ports tree is registered shell: poudriere ports -l -n | grep -q "^quarterly$" failed_when: false changed_when: false register: _poudriere_quarterly_exists - name: Register quarterly ports tree with poudriere shell: poudriere ports -c -p quarterly -m null -M /usr/ports/quarterly when: _poudriere_quarterly_exists.rc != 0 - name: Check if poudriere custom overlay is registered shell: poudriere ports -l -n | grep -q "^custom$" failed_when: false changed_when: false register: _poudriere_custom_exists - name: Register custom overlay with poudriere shell: poudriere ports -c -p custom -m null -M /usr/ports/custom when: _poudriere_custom_exists.rc != 0 - name: Deploy poudriere package list template: src: usr_local_etc_poudriere_pkglist.j2 dest: /usr/local/etc/poudriere-pkglist owner: root group: wheel mode: "0644" - name: Deploy poudriere build make.conf template: src: poudriere_build_make.conf.j2 dest: /usr/local/etc/poudriere.d/poudriere_build-make.conf owner: root group: wheel mode: "0644" # Repo validation gate - name: Check if poudriere repo has packages stat: path: "/usr/local/poudriere/data/packages/poudriere_build-quarterly/meta.pkg" register: _poudriere_repo - name: "*** POUDRIERE REPO NOT READY ***" fail: msg: | ════════════════════════════════════════════════════════════════ POUDRIERE REPOSITORY NOT READY ════════════════════════════════════════════════════════════════ The local package repository has not been built yet. Run the following command on the host to build packages: poudriere bulk -j poudriere_build -p quarterly -O custom -f /usr/local/etc/poudriere-pkglist Then re-run this playbook. ════════════════════════════════════════════════════════════════ when: not _poudriere_repo.stat.exists # Configure local repo - name: Create pkg repos directory file: path: /usr/local/etc/pkg/repos state: directory owner: root group: wheel mode: "0755" - name: Deploy local poudriere repo config copy: content: | poudriere: { url: "http://{{ jail_lan_cidr | ipv4_nth(21 + jail_lan_offset | int) }}/packages", enabled: no } dest: /usr/local/etc/pkg/repos/poudriere.conf owner: root group: wheel mode: "0644" - name: Discover jail directories find: paths: "{{ playbook_dir }}/roles/jails" patterns: "main.yml" recurse: true delegate_to: localhost register: _jail_specs - name: Load jail definitions set_fact: jail_defs: "{{ jail_defs | default([]) + [_content | combine({'num': _num, 'name': _name})] }}" vars: _content: "{{ lookup('file', item.path) | from_yaml }}" _num: "{{ item.path | regex_replace('.*/jails/([^/]+)/.*', '\\1') | split('_') | first | int }}" _name: "{{ item.path | regex_replace('.*/jails/([^/]+)/.*', '\\1') | regex_replace('^[0-9]+_', '') }}" loop: "{{ _jail_specs.files | sort(attribute='path') }}" loop_control: label: "{{ item.path | regex_replace('.*/jails/([^/]+)/.*', '\\1') }}" when: "'/defaults/' in item.path" - name: Collect unique userlands set_fact: jail_userlands: "{{ jail_defs | map(attribute='userland') | unique | list }}" - name: Create base ZFS datasets community.general.zfs: name: "{{ item.name }}" state: present extra_zfs_properties: mountpoint: "{{ item.mountpoint | default(omit) }}" loop: - { name: "zroot/jails", mountpoint: "/usr/local/jails" } - { name: "zroot/jails/media" } - { name: "zroot/jails/templates" } - { name: "zroot/jails/containers" } - { name: "zroot/jails/volumes", mountpoint: "none" } - { name: "zroot/storage", mountpoint: "/usr/local/jails/volumes/storage" } - { name: "zroot/netdata_db", mountpoint: "/var/db/netdata" } - { name: "zroot/ports", mountpoint: "/usr/ports" } loop_control: label: "{{ item.name }}" - name: Install custom packages from poudriere shell: "pkg install -y -r poudriere pylogsentinel" register: _custom_pkg changed_when: "'Number of packages to be installed' in _custom_pkg.stdout" - name: Deploy pylogsentinel.conf template: src: usr_local_etc_pylogsentinel.conf.j2 dest: /usr/local/etc/pylogsentinel.conf owner: root group: wheel mode: "0644" - name: Deploy pylogsentinel-batch-email.sh template: src: usr_local_bin_pylogsentinel-batch-email.sh.j2 dest: /usr/local/bin/pylogsentinel-batch-email.sh owner: root group: wheel mode: "0755" - name: Create storage group group: name: storage gid: 1001 - name: Create storage user user: name: storage uid: 1001 group: storage home: /nonexistent shell: /usr/sbin/nologin create_home: false - name: Set storage volume permissions file: path: /usr/local/jails/volumes/storage state: directory owner: storage group: storage mode: "0777" - name: Create storage directories file: path: "/usr/local/jails/volumes/storage/{{ item.name }}" state: directory owner: "1001" group: "1001" mode: "{{ item.mode }}" loop: - { name: media, mode: "0777" } - { name: docs, mode: "0775" } - { name: downloads, mode: "0777" } - { name: projects-ableton, mode: "0755" } - { name: vault, mode: "0755" } - { name: jan-systems-2025-content, mode: "0755" } - name: Set up userland templates include_tasks: userland.yml loop: "{{ jail_userlands }}" loop_control: loop_var: userland - name: Deploy /etc/jail.conf template: src: jail.conf.j2 dest: /etc/jail.conf owner: root group: wheel mode: "0644" - name: Deploy devfs.rules template: src: devfs.rules.j2 dest: /etc/devfs.rules owner: root group: wheel mode: "0644" - name: Set up crontab template: src: etc_crontab.j2 dest: /etc/crontab owner: root group: wheel mode: "0644" notify: Restart cron