528 Log server and clients (ansible-conf-roles)

Use case

Use the iocage template ansible-init created in 524 iocage template ansible-init. Configure the repository ansible-conf-init to pull the jails’ configuration from the repository ansible-conf-roles. Create jails from the template. Put the configuration files for the class log-server and log-client into the jails’ directories /root/ansible-vars. Run ansible-pull asynchronously.

Tree

shell > tree .
.
├── ansible.cfg
├── files
│   ├── ai-conf-roles.yml
│   ├── ai-db-class.yml
│   ├── log-client
│   │   ├── syslog-ng-client-pkg.yml
│   │   └── syslog-ng-client.yml
│   ├── log-server
│   │   ├── syslog-ng-server-pkg.yml
│   │   └── syslog-ng-server.yml
│   └── pkg-repo.yml
├── group_vars
│   └── all
│       ├── project-hosts.yml
│       └── project.yml
├── hosts
│   └── 06_iocage2.yml
├── iocage.ini
├── pb-logclient-test.yml
├── pb-logserver-test.yml
└── templates
    └── project-hosts.yml.j2

Synopsis

Requirements

Note

Neither the inventory nor the connection plugin is required to create the project. The inventory plugin is used to list the jails and create groups for the test playbooks. The configuration also serves as an example of the connection plugin.

ansible.cfg

[defaults]
callback_result_format = yaml
deprecation_warnings = false
display_skipped_hosts = false
gathering = explicit
interpreter_python = auto_silent
log_path = /var/log/ansible.log

[connection]
pipelining = true

Inventory iocage.ini

iocage_06

[iocage]
iocage_06

[iocage:vars]
ansible_user=admin
ansible_become=true
ansible_python_interpreter=auto_silent

hosts

hosts/06_iocage2.yml
plugin: vbotka.freebsd.iocage2
host: iocage_06
user: admin
sudo: true
get_properties: true
inventory_hostname_tag: alias

compose:
  iocage_tags: dict(iocage_properties.notes | regex_findall('(\w+)=([\w\-]+)'))
  iocage_classes: iocage_properties.notes | regex_findall('(?<=class=)[\w\-]+|(?<=,)[\w\-]+')
# connection plugin vbotka.freebsd.jailexec
  ansible_connection: "'vbotka.freebsd.jailexec'"
  ansible_ssh_user: "'admin'"
  ansible_jail_host: dict(iocage_properties.notes | regex_findall('(\w+)=([\w\-]+)')).vmm | d('none')
  ansible_jail_name: iocage_jid
  ansible_jail_privilege_escalation: "'sudo'"
# ansible options
  ansible_python_interpreter: "'auto_silent'"

groups:
  log_servers: iocage_classes is contains('log-server')
  log_clients: iocage_classes is contains('log-client')

keyed_groups:
  - prefix: state
    key: iocage_state
  - prefix: vmm
    key: iocage_tags.vmm

group_vars

group_vars/all/project-hosts.yml
project_hosts:
  iocage_06:
    defaultrouter: 172.16.99.1
    log_server: 172.16.99.10
    repos: 172.16.99.21
    repos_devel: 172.16.99.22
    pkg_repo: 172.16.99.23
group_vars/all/project.yml
project:
  log-server-01:
    notes: alias=log_server_01
    vmm: iocage_06
    template: ansible-init
    class: [log-server]
    custom_facts: class.fact.j2
    properties:
      defaultrouter: "{{ project_hosts[inventory_hostname]['defaultrouter'] }}"
      ip4_addr: "vnet0|{{ project_hosts[inventory_hostname]['log_server'] }}/24"
      vnet: 1
      boot: 1
    ai_vars:
      - ai-db-class.yml
      - ai-conf-roles.yml
      - pkg-repo.yml
    ai_vars_templates:
      - project-hosts.yml
  www-01:
    notes: alias=www_01
    vmm: iocage_06
    template: ansible-init
    class: [log-client]
    custom_facts: class.fact.j2
    properties:
      bpf: 1
      dhcp: 1
      vnet: 1
      boot: 1
    ai_vars:
      - ai-db-class.yml
      - ai-conf-roles.yml
      - pkg-repo.yml
    ai_vars_templates:
      - project-hosts.yml
  www-02:
    notes: alias=www_02
    vmm: iocage_06
    template: ansible-init
    class: [log-client]
    custom_facts: class.fact.j2
    properties:
      bpf: 1
      dhcp: 1
      vnet: 1
      boot: 1
    ai_vars:
      - ai-db-class.yml
      - ai-conf-roles.yml
      - pkg-repo.yml
    ai_vars_templates:
      - project-hosts.yml

vmm_groups: "{{ dict(project | dict2items | groupby('value.vmm')) }}"
vmm: "{{ dict(vmm_groups.keys() | zip(vmm_groups.values() | map('items2dict'))) }}"

templates

templates/project-hosts.yml.j2
project_hosts:
  {{ project_hosts[inventory_hostname] }}

files

files/ai-db-class.yml
ai_db_class:
  log-server:
    repo_host: "git://{{ project_hosts.repos }}"
    repo: ansible-conf-roles
    repo_dest: /root
    repo_playbook: pb-roles.yml
  log-client:
    repo_host: "git://{{ project_hosts.repos }}"
    repo: ansible-conf-roles
    repo_dest: /root
    repo_playbook: pb-roles.yml

Note

The playbook pb-init.yml (from the ansible-conf-init repository) reads this file from /root/ansible-vars using the ansible.builtin.include_vars module (precedence 18.). The ai_db_class dictionary overrides the values defined in the repository’s host_vars. See Understanding variable precedence.

files/ai-conf-roles.yml
ai_conf_roles:
  vbotka.freebsd.packages: [conf, pkg-install]
  vbotka.freebsd.postinstall: [syslogd, syslog-ng]

Note

The playbook pb-roles.yml (from the ansible-conf-roles repository) reads this file from /root/ansible-vars. The repository does not provide a default ai_conf_roles dictionary.

files/pkg-repo.yml
pkg_repos_conf_clean: true
pkg_repos_conf:
  - name: pkg-repo
    conf:
      - {key: 'url', value: '"http://{{ project_hosts.pkg_repo }}"'}
      - {key: 'enabled', value: 'yes'}
      - {key: 'signature_type', value: '"none"'}

Note

To install packages, the jails use the pkg-repo created in 527 iocage template ansible-pkg-repo.

Important

This configuration is minimal and functional for an isolated lab or trusted internal LAN, but it poses several security risks in production or shared network environments.

files/log-client/syslog-ng-client-pkg.yml
pkg_pkgsite: pkg-repo
pkg_cached: true
pkg_list:
  - syslog-ng
files/log-client/syslog-ng-client.yml
fp_syslogd: true
fp_syslogd_enable: false
fp_syslogd_conf_sanity: false

fp_syslogng: true
fp_syslogng_enable: true
fp_syslogng_conf_template: syslog-ng.conf.j2
fp_syslogng_conf:
  header:
    - '@version:4.8'
    - '@include "scl.conf"'
  options:
    - threaded(yes)
    - group("wheel")
    - perm(0640)
  source:
    s_system:
      - unix-dgram("/var/run/log")
      - unix-dgram("/var/run/logpriv" perm(0600))
      - internal()
    s_ansible:
      - file("/var/log/ansible.log" follow-freq(1) program-override("ansible"))
  destination:
    d_network:
      - network("{{ project_hosts.log_server }}" port(514) transport("tcp"))
  filter:
    f_messages:
      - level(info..emerg) and not facility(auth, authpriv, lpr, mail, news, daemon)
    f_daemon:
      - facility(daemon)
  log:
    - source: s_system
      filter: f_daemon
      destination: d_network
    - source: s_system
      filter: f_messages
      destination: d_network
    - source: s_ansible
      destination: d_network
files/log-server/syslog-ng-server-pkg.yml
pkg_pkgsite: pkg-repo
pkg_cached: true
pkg_list:
  - lnav
  - syslog-ng
files/log-server/syslog-ng-server.yml
fp_syslogd: true
fp_syslogd_enable: false
fp_syslogd_conf_sanity: false

fp_syslogng: true
fp_syslogng_enable: true
fp_syslogng_conf_template: syslog-ng.conf.j2
fp_syslogng_conf:
  header:
    - '@version:4.8'
    - '@include "scl.conf"'
  options:
    - threaded(yes)
    - group("wheel")
    - perm(0640)
  source:
    s_system:
      - unix-dgram("/var/run/log")
      - unix-dgram("/var/run/logpriv" perm(0600))
      - internal()
    s_ansible:
      - file("/var/log/ansible.log" follow-freq(1) program-override("ansible"))
    s_remote:
      - tcp(port(514))
  destination:
    d_local:
      - file("/var/log/remote/${HOST}/${YEAR}_${MONTH}_${DAY}.log" create-dirs(yes))
  filter:
    f_messages:
      - level(notice..emerg) and not facility(auth, authpriv, lpr, mail, news, daemon)
    f_daemon:
      - facility(daemon)
  log:
    - source: s_remote
      destination: d_local
    - source: s_system
      filter: f_daemon
      destination: d_local
    - source: s_system
      filter: f_messages
      destination: d_local
    - source: s_ansible
      destination: d_local

Playbook output - Create project jails from iocage templates

(env) > ansible-playbook -i iocage.ini -i hosts vbotka.freebsd.pb_iocage_project_create_from_templates.yml
PLAY [Create and start project jails from iocage templates.] *******************

TASK [Setup: Get activated pool.] **********************************************
ok: [iocage_06]

TASK [Create: Create jails.] ***************************************************
ok: [iocage_06] => (item=log-server-01)
ok: [iocage_06] => (item=www-01)
ok: [iocage_06] => (item=www-02)

TASK [Facts: Create custom facts dirs.] ****************************************
changed: [iocage_06] => (item=log-server-01)
changed: [iocage_06] => (item=www-01)
changed: [iocage_06] => (item=www-02)

TASK [Facts: Create custom facts files.] ***************************************
changed: [iocage_06] => (item=log-server-01)
changed: [iocage_06] => (item=www-01)
changed: [iocage_06] => (item=www-02)

TASK [Ai-vars: Create ansible init vars dirs.] *********************************
changed: [iocage_06] => (item=log-server-01)
changed: [iocage_06] => (item=www-01)
changed: [iocage_06] => (item=www-02)

TASK [Ai-vars: Create ansible init vars.] **************************************
changed: [iocage_06] => (item=log-server-01 ai-db-class.yml)
changed: [iocage_06] => (item=log-server-01 ai-conf-roles.yml)
changed: [iocage_06] => (item=log-server-01 pkg-repo.yml)
changed: [iocage_06] => (item=www-01 ai-db-class.yml)
changed: [iocage_06] => (item=www-01 ai-conf-roles.yml)
changed: [iocage_06] => (item=www-01 pkg-repo.yml)
changed: [iocage_06] => (item=www-02 ai-db-class.yml)
changed: [iocage_06] => (item=www-02 ai-conf-roles.yml)
changed: [iocage_06] => (item=www-02 pkg-repo.yml)

TASK [Ai-vars-templates: Create ansible init vars dirs.] ***********************
ok: [iocage_06] => (item=log-server-01)
ok: [iocage_06] => (item=www-01)
ok: [iocage_06] => (item=www-02)

TASK [Ai-vars-templates: Create ansible init vars from templates.] *************
changed: [iocage_06] => (item=log-server-01 project-hosts.yml)
changed: [iocage_06] => (item=www-01 project-hosts.yml)
changed: [iocage_06] => (item=www-02 project-hosts.yml)

TASK [Ai-vars-class: Create ansible init vars dirs.] ***************************
ok: [iocage_06] => (item=log-server-01)
ok: [iocage_06] => (item=www-01)
ok: [iocage_06] => (item=www-02)

TASK [Ai-vars-class: Create ansible init vars for class.] **********************
changed: [iocage_06] => (item=log-server-01 log-server)
changed: [iocage_06] => (item=www-01 log-client)
changed: [iocage_06] => (item=www-02 log-client)

TASK [Ai-vars-jail: Create ansible init vars dirs.] ****************************
changed: [iocage_06] => (item=log-server-01)
changed: [iocage_06] => (item=www-01)
changed: [iocage_06] => (item=www-02)

TASK [Properties: Set properties.] *********************************************
ok: [iocage_06] => (item=log-server-01)
ok: [iocage_06] => (item=www-01)
ok: [iocage_06] => (item=www-02)

TASK [Start: Start jails.] *****************************************************
ok: [iocage_06]

PLAY RECAP *********************************************************************
iocage_06                  : ok=13   changed=7    unreachable=0    failed=0    skipped=16   rescued=0    ignored=0   

Inventory graph

shell > ansible-inventory -i hosts --graph
@all:
  |--@ungrouped:
  |--@state_up:
  |  |--foo
  |  |--baz
  |  |--bar
  |  |--repos
  |  |--qux
  |  |--test_153
  |  |--repos_devel
  |  |--pkg_repo
  |  |--log_server_01
  |  |--www_02
  |  |--test_152
  |  |--www_01
  |  |--test_151
  |--@vmm_iocage_06:
  |  |--foo
  |  |--baz
  |  |--bar
  |  |--repos
  |  |--qux
  |  |--test_153
  |  |--db1
  |  |--repos_devel
  |  |--db2
  |  |--pkg_repo
  |  |--log_server_01
  |  |--www_02
  |  |--test_152
  |  |--www_01
  |  |--test_151
  |--@state_down:
  |  |--db1
  |  |--db2
  |--@log_servers:
  |  |--log_server_01
  |--@log_clients:
  |  |--www_02
  |  |--www_01

List jails

shell > ssh admin@iocage_06 sudo iocage list -l
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| JID  |     NAME      | BOOT | STATE | TYPE |     RELEASE     |          IP4          | IP6 |     TEMPLATE     | BASEJAIL |
+======+===============+======+=======+======+=================+=======================+=====+==================+==========+
| None | 09caf271      | off  | down  | jail | 15.1-RELEASE-p1 | DHCP (not running)    | -   | -                | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| None | 1718af82      | off  | down  | jail | 15.1-RELEASE-p1 | DHCP (not running)    | -   | -                | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 37   | bar           | on   | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.143 | -   | ansible-init     | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 38   | baz           | on   | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.141 | -   | ansible-init     | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 36   | foo           | on   | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.138 | -   | ansible-init     | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 45   | log-server-01 | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.10/24 | -   | ansible-init     | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 44   | pkg-repo      | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.23/24 | -   | ansible-pkg-repo | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 39   | qux           | on   | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.144 | -   | ansible-init     | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 34   | repos         | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.21/24 | -   | ansible-repos    | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 35   | repos-devel   | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.22/24 | -   | ansible-repos    | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 28   | test-151      | off  | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.189 | -   | ansible-client   | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 27   | test-152      | off  | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.188 | -   | ansible-client   | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 26   | test-153      | off  | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.187 | -   | ansible-client   | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 46   | www-01        | on   | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.116 | -   | ansible-init     | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 47   | www-02        | on   | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.147 | -   | ansible-init     | no       |
+------+---------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+

Playbook pb-logserver-test.yml

---
- name: Test Log Server.
  hosts: log_servers
    
  tasks:

    - name: Run commands.
      register: out
      ansible.builtin.shell: "{{ item }}"
      loop:
        - rm -rf /var/log/remote/localhost/*
        - service syslog-ng status
        - loggen -i -S -n 1 localhost 514
        - sleep 2; find /var/log/remote/localhost/ -name *.log | xargs cat

    - name: Debug.
      when: debug | d(false) | bool
      ansible.builtin.debug:
        msg: |
          {% for i in out.results %}
          shell> {{ i.item }}
          {% if i.stdout | length > 0 %}
          {{ i.stdout }}
          {% endif %}
          {% if i.stderr | length > 0 %}
          {{ i.stderr }}
          {% endif %}

          {% endfor %}

Playbook output - Test Log Server

(env) > ansible-playbook -i hosts -e debug=true pb-logserver-test.yml
PLAY [Test Log Server.] ********************************************************

TASK [Run commands.] ***********************************************************
changed: [log_server_01] => (item=rm -rf /var/log/remote/localhost/*)
changed: [log_server_01] => (item=service syslog-ng status)
changed: [log_server_01] => (item=loggen -i -S -n 1 localhost 514)
changed: [log_server_01] => (item=sleep 2; find /var/log/remote/localhost/ -name *.log | xargs cat)

TASK [Debug.] ******************************************************************
ok: [log_server_01] => 
    msg: |-
        shell> rm -rf /var/log/remote/localhost/*

        shell> service syslog-ng status
        syslog_ng is running as pid 93581.

        shell> loggen -i -S -n 1 localhost 514
        count=1, rate = 500000.00 msg/sec
        average rate = 2.00 msg/sec, count=1, time=0.500131, (average) msg size=256, bandwidth=0.50 kB/sec

        shell> sleep 2; find /var/log/remote/localhost/ -name *.log | xargs cat
        Aug 27 12:16:37 localhost prg00000[1234]: seq: 0000000000, thread: 0000, runid: 1787825797, stamp: 2026-08-27T12:16:37 PADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADD

PLAY RECAP *********************************************************************
log_server_01              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Playbook pb-logclient-test.yml

---
- name: Test Log Clients.
  hosts: log_clients

  vars:

    log_server: "{{ hostvars['log_server_01']['iocage_ip4'] }}"

  tasks:

    - name: Run loggen
      register: out
      ansible.builtin.command: "loggen -i -S -n 1 {{ log_server }} 514"

    - name: Debug.
      ansible.builtin.debug:
        var: out.stderr

- name: Display the logs.
  hosts: log_servers
    
  tasks:

    - name: Get log files paths.
      register: out
      ansible.builtin.find:
        paths: /var/log/remote
        recurse: true
        patterns: '*.log'

    - name: Get log files.
      register: out
      ansible.builtin.command: "cat {{ item }}"
      loop: "{{ out.files | map(attribute='path') }}"

    - name: Display log files.
      ansible.builtin.debug:
        msg: |
          {{ item.stdout }}

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      loop: "{{ out.results }}"
      loop_control:
        label: "{{ item.cmd }}"

Playbook output - Test Log Clients

(env) > ansible-playbook -i hosts pb-logclient-test.yml
PLAY [Test Log Clients.] *******************************************************

TASK [Run loggen] **************************************************************
changed: [www_01]
changed: [www_02]

TASK [Debug.] ******************************************************************
ok: [www_02] => 
    out.stderr: |-
        count=1, rate = 500000.00 msg/sec
        average rate = 2.00 msg/sec, count=1, time=0.50029, (average) msg size=256, bandwidth=0.50 kB/sec
ok: [www_01] => 
    out.stderr: |-
        count=1, rate = 71428.57 msg/sec
        average rate = 2.00 msg/sec, count=1, time=0.500225, (average) msg size=256, bandwidth=0.50 kB/sec

PLAY [Display the logs.] *******************************************************

TASK [Get log files paths.] ****************************************************
ok: [log_server_01]

TASK [Get log files.] **********************************************************
changed: [log_server_01] => (item=/var/log/remote/ip-172-16-99-116/2026_08_27.log)
changed: [log_server_01] => (item=/var/log/remote/ip-172-16-99-147/2026_08_27.log)
changed: [log_server_01] => (item=/var/log/remote/localhost/2026_08_27.log)

TASK [Display log files.] ******************************************************
ok: [log_server_01] => (item=['cat', '/var/log/remote/ip-172-16-99-116/2026_08_27.log']) => 
    msg: |-
        Aug 27 12:10:34 ip-172-16-99-116 syslog-ng[93077]: syslog-ng starting up; version='4.12.0'
        Aug 27 12:10:34 ip-172-16-99-116 syslog-ng[93077]: Syslog connection failed; fd='19', server='AF_INET(172.16.99.10:514)', error='Connection refused (61)', time_reopen='60'
        Aug 27 12:10:35 ip-172-16-99-116 1 2026-08-27T12:10:35.289417+02:00 www-01 ansible-vbotka.freebsd.service 93194 - - Invoked with command=reload script=syslog-ng list_enabled=False synopsis=False wait=0.5 env=None jail=None
        Aug 27 12:09:04 ip-172-16-99-116 ansible: n=ansible WARNING| [WARNING]: Could not match supplied host pattern, ignoring: www-01
        Aug 27 12:09:04 ip-172-16-99-116 ansible: n=ansible INFO| PLAY [ansible-init] ************************************************************
        Aug 27 12:09:05 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Get hostname.] ***********************************************************
        Aug 27 12:09:05 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Get custom facts.] *******************************************************
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Include variables from ai_vars directory.] *******************************
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/syslog-ng-client.yml)
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/pkg-repo.yml)
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/project-hosts.yml)
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/ai-db-class.yml)
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/ai-conf-roles.yml)
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/syslog-ng-client-pkg.yml)
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Display vars.] ***********************************************************
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] =>
        Aug 27 12:10:35 ip-172-16-99-116 ansible: |-
        Aug 27 12:10:35 ip-172-16-99-116 ansible: true
        Aug 27 12:10:35 ip-172-16-99-116 ansible: /root/ansible-vars
        Aug 27 12:10:35 ip-172-16-99-116 ansible: www-01
        Aug 27 12:10:35 ip-172-16-99-116 ansible: ['log-client']
        Aug 27 12:10:35 ip-172-16-99-116 ansible: {'defaultrouter': '172.16.99.1', 'log_server': '172.16.99.10', 'repos': '172.16.99.21', 'repos_devel': '172.16.99.22', 'pkg_repo': '172.16.99.23'}
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Set ai_cmd] **************************************************************
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Execute ai_cmd] **********************************************************
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| included: /root/ansible-conf-init/tasks/execute-cmd.yml for localhost.my.domain
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Display vars.] ***********************************************************
        Aug 27 12:09:06 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] =>
        Aug 27 12:10:35 ip-172-16-99-116 ansible: |-
        Aug 27 12:10:35 ip-172-16-99-116 ansible:
        Aug 27 12:10:35 ip-172-16-99-116 ansible: True
        Aug 27 12:10:35 ip-172-16-99-116 ansible:      ansible-pull -i hosts -U git://172.16.99.21/ansible-conf-roles -d /root/ansible-conf-roles -e "ai_vars=/root/ansible-vars" -e "ai_pull_mode=true" pb-roles.yml &&  echo '[INFO] ansible-pull finished.'
        Aug 27 12:09:07 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Execute command async=3600 poll=0] ***************************************
        Aug 27 12:09:07 ip-172-16-99-116 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 12:09:07 ip-172-16-99-116 ansible: n=ansible INFO| PLAY RECAP *********************************************************************
        Aug 27 12:09:07 ip-172-16-99-116 ansible: n=ansible INFO| localhost.my.domain        : ok=8    changed=1    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0
        Aug 27 12:09:07 ip-172-16-99-116 ansible: n=ansible INFO| Starting Ansible Pull at 2026-08-27 12:09:07
        Aug 27 12:09:07 ip-172-16-99-116 ansible: n=ansible INFO| /usr/local/bin/ansible-pull -i hosts -U git://172.16.99.21/ansible-conf-roles -d /root/ansible-conf-roles -e ai_vars=/root/ansible-vars -e ai_pull_mode=true pb-roles.yml
        Aug 27 12:09:08 ip-172-16-99-116 ansible: n=ansible WARNING| [WARNING]: Could not match supplied host pattern, ignoring: www-01
        Aug 27 12:09:10 ip-172-16-99-116 ansible: n=ansible INFO| localhost.my.domain | CHANGED => {
        Aug 27 12:10:35 ip-172-16-99-116 ansible: "90c5906a366cba3907eb615e1b8fad119793a6f1",
        Aug 27 12:10:35 ip-172-16-99-116 ansible: {
        Aug 27 12:10:35 ip-172-16-99-116 ansible: "/usr/local/bin/python3.12"
        Aug 27 12:10:35 ip-172-16-99-116 ansible:
        Aug 27 12:10:35 ip-172-16-99-116 ansible: null,
        Aug 27 12:10:35 ip-172-16-99-116 ansible: true
        Aug 27 12:10:35 ip-172-16-99-116 ansible:
        Aug 27 12:09:11 ip-172-16-99-116 ansible: n=ansible WARNING| [WARNING]: Could not match supplied host pattern, ignoring: www-01
        Aug 27 12:09:11 ip-172-16-99-116 ansible: n=ansible INFO| PLAY [Use Ansible roles.] ******************************************************
        Aug 27 12:09:11 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Include variables from ai_vars directory.] *******************************
        Aug 27 12:09:11 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/syslog-ng-client.yml)
        Aug 27 12:09:11 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/pkg-repo.yml)
        Aug 27 12:09:12 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/project-hosts.yml)
        Aug 27 12:09:12 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/ai-db-class.yml)
        Aug 27 12:09:12 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/ai-conf-roles.yml)
        Aug 27 12:09:12 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/syslog-ng-client-pkg.yml)
        Aug 27 12:09:12 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Display vars.] ***********************************************************
        Aug 27 12:09:12 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] =>
        Aug 27 12:10:35 ip-172-16-99-116 ansible: |-
        Aug 27 12:10:35 ip-172-16-99-116 ansible: true
        Aug 27 12:10:35 ip-172-16-99-116 ansible: /root/ansible-vars
        Aug 27 12:10:35 ip-172-16-99-116 ansible: {'vbotka.freebsd.packages': ['conf', 'pkg-install'], 'vbotka.freebsd.postinstall': ['syslogd', 'syslog-ng']}
        Aug 27 12:09:12 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Include roles.] **********************************************************
        Aug 27 12:09:12 ip-172-16-99-116 ansible: n=ansible INFO| included: vbotka.freebsd.packages for localhost.my.domain => (item=vbotka.freebsd.packages: conf)
        Aug 27 12:09:12 ip-172-16-99-116 ansible: n=ansible INFO| included: vbotka.freebsd.packages for localhost.my.domain => (item=vbotka.freebsd.packages: pkg-install)
        Aug 27 12:09:12 ip-172-16-99-116 ansible: n=ansible INFO| included: vbotka.freebsd.postinstall for localhost.my.domain => (item=vbotka.freebsd.postinstall: syslogd)
        Aug 27 12:09:13 ip-172-16-99-116 ansible: n=ansible INFO| included: vbotka.freebsd.postinstall for localhost.my.domain => (item=vbotka.freebsd.postinstall: syslog-ng)
        Aug 27 12:09:14 ip-172-16-99-116 ansible: n=ansible INFO| TASK [vbotka.freebsd.packages : Conf: Create directories] **********************
        Aug 27 12:09:14 ip-172-16-99-116 ansible: n=ansible INFO| changed: [localhost.my.domain] => (item=/usr/local/etc/pkg)
        Aug 27 12:09:14 ip-172-16-99-116 ansible: n=ansible INFO| changed: [localhost.my.domain] => (item=/usr/local/etc/pkg/repos)
        Aug 27 12:09:15 ip-172-16-99-116 ansible: n=ansible INFO| TASK [vbotka.freebsd.packages : Conf: Configure /usr/local/etc/pkg/repos] ******
        Aug 27 12:09:15 ip-172-16-99-116 ansible: n=ansible INFO| changed: [localhost.my.domain] => (item=pkg-repo)
        Aug 27 12:09:16 ip-172-16-99-116 ansible: n=ansible INFO| TASK [vbotka.freebsd.packages : Conf: Find repos] ******************************
        Aug 27 12:09:16 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 12:10:29 ip-172-16-99-116 ansible: n=ansible INFO| TASK [vbotka.freebsd.packages : Packages_install: Install list pkg_list] *******
        Aug 27 12:10:29 ip-172-16-99-116 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 12:10:31 ip-172-16-99-116 ansible: n=ansible INFO| TASK [vbotka.freebsd.postinstall : Rcconf: Configure syslogd_enable in /etc/rc.conf] ***
        Aug 27 12:10:31 ip-172-16-99-116 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 12:10:31 ip-172-16-99-116 ansible: n=ansible INFO| TASK [vbotka.freebsd.postinstall : Syslog-ng: Sanity fp_syslogng_conf is empty.] ***
        Aug 27 12:10:31 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 12:10:32 ip-172-16-99-116 ansible: n=ansible INFO| TASK [vbotka.freebsd.postinstall : Syslog-ng: Configure /usr/local/etc/syslog-ng.conf] ***
        Aug 27 12:10:32 ip-172-16-99-116 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 12:10:33 ip-172-16-99-116 ansible: n=ansible INFO| TASK [vbotka.freebsd.postinstall : Rcconf: Configure syslog_ng_enable in /etc/rc.conf] ***
        Aug 27 12:10:33 ip-172-16-99-116 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 12:10:34 ip-172-16-99-116 ansible: n=ansible INFO| RUNNING HANDLER [vbotka.freebsd.postinstall : Start syslog-ng] *****************
        Aug 27 12:10:34 ip-172-16-99-116 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 12:10:36 ip-172-16-99-116 syslog-ng[93077]: Loading the new configuration;
        Aug 27 12:10:36 ip-172-16-99-116 syslog-ng[93077]: Configuration reload finished;
        Aug 27 12:10:36 ip-172-16-99-116 syslog-ng[93077]: Syslog connection failed; fd='19', server='AF_INET(172.16.99.10:514)', error='Connection refused (61)', time_reopen='60'
        Aug 27 12:10:37 ip-172-16-99-116 1 2026-08-27T12:10:37.339007+02:00 www-01 ansible-vbotka.freebsd.service 93378 - - Invoked with command=stop script=syslogd list_enabled=False synopsis=False wait=0.5 env=None jail=None
        Aug 27 12:10:36 ip-172-16-99-116 ansible: n=ansible INFO| RUNNING HANDLER [vbotka.freebsd.postinstall : Reload syslog-ng] ****************
        Aug 27 12:10:36 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 12:10:38 ip-172-16-99-116 ansible: n=ansible INFO| RUNNING HANDLER [vbotka.freebsd.postinstall : Stop syslogd] ********************
        Aug 27 12:10:38 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 12:10:38 ip-172-16-99-116 ansible: n=ansible INFO| PLAY RECAP *********************************************************************
        Aug 27 12:10:38 ip-172-16-99-116 ansible: n=ansible INFO| localhost.my.domain        : ok=17   changed=7    unreachable=0    failed=0    skipped=45   rescued=0    ignored=0
        Aug 27 12:10:39 ip-172-16-99-116 1 2026-08-27T12:10:39.256827+02:00 www-01 ansible-async_wrapper.py 89486 - - Module complete (89486)
        Aug 27 12:11:36 ip-172-16-99-116 syslog-ng[93077]: Syslog connection established; fd='5', server='AF_INET(172.16.99.10:514)', local='AF_INET(0.0.0.0:0)'
        Aug 27 12:13:59 ip-172-16-99-116 1 2026-08-27T12:13:59.648741+02:00 www-01 dhclient 89067 - - DHCPREQUEST on epair0b to 172.16.99.1 port 67
        Aug 27 12:13:59 ip-172-16-99-116 1 2026-08-27T12:13:59.649306+02:00 www-01 dhclient 89067 - - DHCPACK from 172.16.99.1
        Aug 27 12:13:59 ip-172-16-99-116 1 2026-08-27T12:13:59.663303+02:00 www-01 dhclient 89067 - - bound to 172.16.99.116 -- renewal in 300 seconds.
        Aug 27 12:16:49 ip-172-16-99-116 1 2026-08-27T12:16:49.351329+02:00 www-01 ansible-ansible.legacy.command 94277 - - Invoked with _raw_params=loggen -i -S -n 1 172.16.99.10 514 _uses_shell=False expand_argument_vars=True stdin_add_newline=True strip_empty_ends=True cmd=None argv=None chdir=None executable=None creates=None removes=None stdin=None
        Aug 27 12:16:49 ip-172-16-99-116 prg00000[1234]: seq: 0000000000, thread: 0000, runid: 1787825809, stamp: 2026-08-27T12:16:49 PADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADD

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ok: [log_server_01] => (item=['cat', '/var/log/remote/ip-172-16-99-147/2026_08_27.log']) => 
    msg: |-
        Aug 27 12:10:32 ip-172-16-99-147 syslog-ng[92718]: syslog-ng starting up; version='4.12.0'
        Aug 27 12:10:32 ip-172-16-99-147 syslog-ng[92718]: Syslog connection failed; fd='19', server='AF_INET(172.16.99.10:514)', error='Connection refused (61)', time_reopen='60'
        Aug 27 12:10:33 ip-172-16-99-147 1 2026-08-27T12:10:33.528137+02:00 www-02 ansible-vbotka.freebsd.service 92766 - - Invoked with command=reload script=syslog-ng list_enabled=False synopsis=False wait=0.5 env=None jail=None
        Aug 27 12:09:15 ip-172-16-99-147 ansible: n=ansible WARNING| [WARNING]: Could not match supplied host pattern, ignoring: www-02
        Aug 27 12:09:15 ip-172-16-99-147 ansible: n=ansible INFO| PLAY [ansible-init] ************************************************************
        Aug 27 12:09:16 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Get hostname.] ***********************************************************
        Aug 27 12:09:16 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Get custom facts.] *******************************************************
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Include variables from ai_vars directory.] *******************************
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/syslog-ng-client.yml)
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/syslog-ng-client-pkg.yml)
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/project-hosts.yml)
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/pkg-repo.yml)
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/ai-conf-roles.yml)
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/ai-db-class.yml)
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Display vars.] ***********************************************************
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] =>
        Aug 27 12:10:33 ip-172-16-99-147 ansible: |-
        Aug 27 12:10:33 ip-172-16-99-147 ansible: true
        Aug 27 12:10:33 ip-172-16-99-147 ansible: /root/ansible-vars
        Aug 27 12:10:33 ip-172-16-99-147 ansible: www-02
        Aug 27 12:10:33 ip-172-16-99-147 ansible: ['log-client']
        Aug 27 12:10:33 ip-172-16-99-147 ansible: {'defaultrouter': '172.16.99.1', 'log_server': '172.16.99.10', 'repos': '172.16.99.21', 'repos_devel': '172.16.99.22', 'pkg_repo': '172.16.99.23'}
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Set ai_cmd] **************************************************************
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Execute ai_cmd] **********************************************************
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| included: /root/ansible-conf-init/tasks/execute-cmd.yml for localhost.my.domain
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Display vars.] ***********************************************************
        Aug 27 12:09:17 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] =>
        Aug 27 12:10:33 ip-172-16-99-147 ansible: |-
        Aug 27 12:10:33 ip-172-16-99-147 ansible:
        Aug 27 12:10:33 ip-172-16-99-147 ansible: True
        Aug 27 12:10:33 ip-172-16-99-147 ansible:      ansible-pull -i hosts -U git://172.16.99.21/ansible-conf-roles -d /root/ansible-conf-roles -e "ai_vars=/root/ansible-vars" -e "ai_pull_mode=true" pb-roles.yml &&  echo '[INFO] ansible-pull finished.'
        Aug 27 12:09:18 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Execute command async=3600 poll=0] ***************************************
        Aug 27 12:09:18 ip-172-16-99-147 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 12:09:18 ip-172-16-99-147 ansible: n=ansible INFO| PLAY RECAP *********************************************************************
        Aug 27 12:09:18 ip-172-16-99-147 ansible: n=ansible INFO| localhost.my.domain        : ok=8    changed=1    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0
        Aug 27 12:09:19 ip-172-16-99-147 ansible: n=ansible INFO| Starting Ansible Pull at 2026-08-27 12:09:19
        Aug 27 12:09:19 ip-172-16-99-147 ansible: n=ansible INFO| /usr/local/bin/ansible-pull -i hosts -U git://172.16.99.21/ansible-conf-roles -d /root/ansible-conf-roles -e ai_vars=/root/ansible-vars -e ai_pull_mode=true pb-roles.yml
        Aug 27 12:09:20 ip-172-16-99-147 ansible: n=ansible WARNING| [WARNING]: Could not match supplied host pattern, ignoring: www-02
        Aug 27 12:09:21 ip-172-16-99-147 ansible: n=ansible INFO| localhost.my.domain | CHANGED => {
        Aug 27 12:10:33 ip-172-16-99-147 ansible: "90c5906a366cba3907eb615e1b8fad119793a6f1",
        Aug 27 12:10:33 ip-172-16-99-147 ansible: {
        Aug 27 12:10:33 ip-172-16-99-147 ansible: "/usr/local/bin/python3.12"
        Aug 27 12:10:33 ip-172-16-99-147 ansible:
        Aug 27 12:10:33 ip-172-16-99-147 ansible: null,
        Aug 27 12:10:33 ip-172-16-99-147 ansible: true
        Aug 27 12:10:33 ip-172-16-99-147 ansible:
        Aug 27 12:09:23 ip-172-16-99-147 ansible: n=ansible WARNING| [WARNING]: Could not match supplied host pattern, ignoring: www-02
        Aug 27 12:09:23 ip-172-16-99-147 ansible: n=ansible INFO| PLAY [Use Ansible roles.] ******************************************************
        Aug 27 12:09:23 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Include variables from ai_vars directory.] *******************************
        Aug 27 12:09:23 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/syslog-ng-client.yml)
        Aug 27 12:09:23 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/syslog-ng-client-pkg.yml)
        Aug 27 12:09:23 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/project-hosts.yml)
        Aug 27 12:09:23 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/pkg-repo.yml)
        Aug 27 12:09:23 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/ai-conf-roles.yml)
        Aug 27 12:09:23 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/ai-db-class.yml)
        Aug 27 12:09:23 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Display vars.] ***********************************************************
        Aug 27 12:09:23 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] =>
        Aug 27 12:10:33 ip-172-16-99-147 ansible: |-
        Aug 27 12:10:33 ip-172-16-99-147 ansible: true
        Aug 27 12:10:33 ip-172-16-99-147 ansible: /root/ansible-vars
        Aug 27 12:10:33 ip-172-16-99-147 ansible: {'vbotka.freebsd.packages': ['conf', 'pkg-install'], 'vbotka.freebsd.postinstall': ['syslogd', 'syslog-ng']}
        Aug 27 12:09:23 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Include roles.] **********************************************************
        Aug 27 12:09:23 ip-172-16-99-147 ansible: n=ansible INFO| included: vbotka.freebsd.packages for localhost.my.domain => (item=vbotka.freebsd.packages: conf)
        Aug 27 12:09:23 ip-172-16-99-147 ansible: n=ansible INFO| included: vbotka.freebsd.packages for localhost.my.domain => (item=vbotka.freebsd.packages: pkg-install)
        Aug 27 12:09:24 ip-172-16-99-147 ansible: n=ansible INFO| included: vbotka.freebsd.postinstall for localhost.my.domain => (item=vbotka.freebsd.postinstall: syslogd)
        Aug 27 12:09:24 ip-172-16-99-147 ansible: n=ansible INFO| included: vbotka.freebsd.postinstall for localhost.my.domain => (item=vbotka.freebsd.postinstall: syslog-ng)
        Aug 27 12:09:25 ip-172-16-99-147 ansible: n=ansible INFO| TASK [vbotka.freebsd.packages : Conf: Create directories] **********************
        Aug 27 12:09:25 ip-172-16-99-147 ansible: n=ansible INFO| changed: [localhost.my.domain] => (item=/usr/local/etc/pkg)
        Aug 27 12:09:25 ip-172-16-99-147 ansible: n=ansible INFO| changed: [localhost.my.domain] => (item=/usr/local/etc/pkg/repos)
        Aug 27 12:09:27 ip-172-16-99-147 ansible: n=ansible INFO| TASK [vbotka.freebsd.packages : Conf: Configure /usr/local/etc/pkg/repos] ******
        Aug 27 12:09:27 ip-172-16-99-147 ansible: n=ansible INFO| changed: [localhost.my.domain] => (item=pkg-repo)
        Aug 27 12:09:27 ip-172-16-99-147 ansible: n=ansible INFO| TASK [vbotka.freebsd.packages : Conf: Find repos] ******************************
        Aug 27 12:09:27 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 12:10:26 ip-172-16-99-147 ansible: n=ansible INFO| TASK [vbotka.freebsd.packages : Packages_install: Install list pkg_list] *******
        Aug 27 12:10:26 ip-172-16-99-147 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 12:10:28 ip-172-16-99-147 ansible: n=ansible INFO| TASK [vbotka.freebsd.postinstall : Rcconf: Configure syslogd_enable in /etc/rc.conf] ***
        Aug 27 12:10:28 ip-172-16-99-147 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 12:10:28 ip-172-16-99-147 ansible: n=ansible INFO| TASK [vbotka.freebsd.postinstall : Syslog-ng: Sanity fp_syslogng_conf is empty.] ***
        Aug 27 12:10:28 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 12:10:29 ip-172-16-99-147 ansible: n=ansible INFO| TASK [vbotka.freebsd.postinstall : Syslog-ng: Configure /usr/local/etc/syslog-ng.conf] ***
        Aug 27 12:10:29 ip-172-16-99-147 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 12:10:31 ip-172-16-99-147 ansible: n=ansible INFO| TASK [vbotka.freebsd.postinstall : Rcconf: Configure syslog_ng_enable in /etc/rc.conf] ***
        Aug 27 12:10:31 ip-172-16-99-147 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 12:10:33 ip-172-16-99-147 ansible: n=ansible INFO| RUNNING HANDLER [vbotka.freebsd.postinstall : Start syslog-ng] *****************
        Aug 27 12:10:33 ip-172-16-99-147 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 12:10:33 ip-172-16-99-147 syslog-ng[92718]: Loading the new configuration;
        Aug 27 12:10:33 ip-172-16-99-147 syslog-ng[92718]: Configuration reload finished;
        Aug 27 12:10:33 ip-172-16-99-147 syslog-ng[92718]: Syslog connection failed; fd='19', server='AF_INET(172.16.99.10:514)', error='Connection refused (61)', time_reopen='60'
        Aug 27 12:10:34 ip-172-16-99-147 1 2026-08-27T12:10:34.574498+02:00 www-02 ansible-vbotka.freebsd.service 92991 - - Invoked with command=stop script=syslogd list_enabled=False synopsis=False wait=0.5 env=None jail=None
        Aug 27 12:10:34 ip-172-16-99-147 ansible: n=ansible INFO| RUNNING HANDLER [vbotka.freebsd.postinstall : Reload syslog-ng] ****************
        Aug 27 12:10:34 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 12:10:35 ip-172-16-99-147 ansible: n=ansible INFO| RUNNING HANDLER [vbotka.freebsd.postinstall : Stop syslogd] ********************
        Aug 27 12:10:35 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 12:10:35 ip-172-16-99-147 ansible: n=ansible INFO| PLAY RECAP *********************************************************************
        Aug 27 12:10:35 ip-172-16-99-147 ansible: n=ansible INFO| localhost.my.domain        : ok=17   changed=7    unreachable=0    failed=0    skipped=45   rescued=0    ignored=0
        Aug 27 12:10:36 ip-172-16-99-147 1 2026-08-27T12:10:36.504878+02:00 www-02 ansible-async_wrapper.py 90673 - - Module complete (90673)
        Aug 27 12:11:33 ip-172-16-99-147 syslog-ng[92718]: Syslog connection established; fd='5', server='AF_INET(172.16.99.10:514)', local='AF_INET(0.0.0.0:0)'
        Aug 27 12:14:09 ip-172-16-99-147 1 2026-08-27T12:14:09.789725+02:00 www-02 dhclient 90178 - - DHCPREQUEST on epair0b to 172.16.99.1 port 67
        Aug 27 12:14:09 ip-172-16-99-147 1 2026-08-27T12:14:09.790650+02:00 www-02 dhclient 90178 - - DHCPACK from 172.16.99.1
        Aug 27 12:14:09 ip-172-16-99-147 1 2026-08-27T12:14:09.803889+02:00 www-02 dhclient 90178 - - bound to 172.16.99.147 -- renewal in 300 seconds.
        Aug 27 12:16:49 ip-172-16-99-147 1 2026-08-27T12:16:49.394897+02:00 www-02 ansible-ansible.legacy.command 94279 - - Invoked with _raw_params=loggen -i -S -n 1 172.16.99.10 514 _uses_shell=False expand_argument_vars=True stdin_add_newline=True strip_empty_ends=True cmd=None argv=None chdir=None executable=None creates=None removes=None stdin=None
        Aug 27 12:16:49 ip-172-16-99-147 prg00000[1234]: seq: 0000000000, thread: 0000, runid: 1787825809, stamp: 2026-08-27T12:16:49 PADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADD

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ok: [log_server_01] => (item=['cat', '/var/log/remote/localhost/2026_08_27.log']) => 
    msg: |-
        Aug 27 12:16:37 localhost prg00000[1234]: seq: 0000000000, thread: 0000, runid: 1787825797, stamp: 2026-08-27T12:16:37 PADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADD

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

PLAY RECAP *********************************************************************
log_server_01              : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
www_01                     : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
www_02                     : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Hint

Use the lnav utility on the log server to display all logfiles in the the directory /var/log/remote. Run the following commands on the iocage host:

shell > iocage console log-server
root@log-server:~ # lnav -r /var/log/remote/