526 Log server and clients (ansible_init)

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 repositories ansible-conf-syslogng-server and ansible-conf-syslogng-client. Create jails from the template. Use class=log-server and class=log-client to select the configuration. Run ansible-pull asynchronously.

Tree

shell > tree .
.
├── ansible.cfg
├── 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_05:
    defaultrouter: 172.16.99.1
    log_server: 172.16.99.10
    # repositories
    repos: 172.16.99.21
    repos_devel: 172.16.99.22
    # plugins
    ansible_pull_syslogng_server: 172.16.99.31
  iocage_06:
    defaultrouter: 172.16.99.1
    log_server: 172.16.99.10
    # repositories
    repos: 172.16.99.21
    repos_devel: 172.16.99.22
    # plugins
    ansible_pull_syslogng_server: 172.16.99.31
group_vars/all/project.yml
project:
  log-server:
    notes: alias=log_server
    vmm: iocage_06
    template: ansible-init
    class: [log-server]
    custom_facts: class.fact.j2
    ai_vars_templates:
      - project-hosts.yml
    properties:
      defaultrouter: "{{ project_hosts[inventory_hostname]['defaultrouter'] }}"
      ip4_addr: "vnet0|{{ project_hosts[inventory_hostname]['log_server'] }}/24"
      vnet: 1
      boot: 1
  www-01:
    notes: alias=www_01
    vmm: iocage_06
    template: ansible-init
    class: [log-client]
    custom_facts: class.fact.j2
    ai_vars_templates:
      - project-hosts.yml
    properties:
      bpf: 1
      dhcp: 1
      vnet: 1
      boot: 1
  www-02:
    notes: alias=www_02
    vmm: iocage_06
    template: ansible-init
    class: [log-client]
    custom_facts: class.fact.j2
    ai_vars_templates:
      - project-hosts.yml
    properties:
      bpf: 1
      dhcp: 1
      vnet: 1
      boot: 1

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] }}

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=www-01)
ok: [iocage_06] => (item=log-server)
ok: [iocage_06] => (item=www-02)

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

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

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

TASK [Ai-vars-templates: Create ansible init vars from templates.] *************
changed: [iocage_06] => (item=log-server 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)
ok: [iocage_06] => (item=www-01)
ok: [iocage_06] => (item=www-02)

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

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

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

PLAY RECAP *********************************************************************
iocage_06                  : ok=10   changed=4    unreachable=0    failed=0    skipped=19   rescued=0    ignored=0   

Inventory graph

shell > ansible-inventory -i hosts --graph
@all:
  |--@ungrouped:
  |--@state_up:
  |  |--foo
  |  |--baz
  |  |--bar
  |  |--repos
  |  |--qux
  |  |--test_153
  |  |--log_server
  |  |--repos_devel
  |  |--pkg_repo
  |  |--www_02
  |  |--test_152
  |  |--www_01
  |  |--test_151
  |--@vmm_iocage_06:
  |  |--foo
  |  |--baz
  |  |--bar
  |  |--repos
  |  |--qux
  |  |--test_153
  |  |--log_server
  |  |--db1
  |  |--repos_devel
  |  |--db2
  |  |--pkg_repo
  |  |--www_02
  |  |--test_152
  |  |--www_01
  |  |--test_151
  |--@log_servers:
  |  |--log_server
  |--@state_down:
  |  |--db1
  |  |--db2
  |--@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       |
+------+-------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 40   | log-server  | on   | up    | jail | 15.1-RELEASE-p1 | vnet0|172.16.99.10/24 | -   | ansible-init     | no       |
+------+-------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 21   | 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       |
+------+-------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 41   | www-01      | on   | up    | jail | 15.1-RELEASE-p1 | epair0b|172.16.99.116 | -   | ansible-init     | no       |
+------+-------------+------+-------+------+-----------------+-----------------------+-----+------------------+----------+
| 42   | 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] => (item=rm -rf /var/log/remote/localhost/*)
changed: [log_server] => (item=service syslog-ng status)
changed: [log_server] => (item=loggen -i -S -n 1 localhost 514)
changed: [log_server] => (item=sleep 2; find /var/log/remote/localhost/ -name *.log | xargs cat)

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

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

        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.500308, (average) msg size=256, bandwidth=0.50 kB/sec

        shell> sleep 2; find /var/log/remote/localhost/ -name *.log | xargs cat
        Aug 27 11:57:46 localhost prg00000[1234]: seq: 0000000000, thread: 0000, runid: 1787824666, stamp: 2026-08-27T11:57:46 PADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADD

PLAY RECAP *********************************************************************
log_server                 : 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']['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_server
    
  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_02]
changed: [www_01]

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

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

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

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

TASK [Display log files.] ******************************************************
ok: [log_server] => (item=['cat', '/var/log/remote/ip-172-16-99-147/2026_08_27.log']) => 
    msg: |-
        Aug 27 11:51:59 ip-172-16-99-147 syslog-ng[80567]: syslog-ng starting up; version='4.12.0'
        Aug 27 11:51:59 ip-172-16-99-147 syslog-ng[80567]: Syslog connection established; fd='19', server='AF_INET(172.16.99.10:514)', local='AF_INET(0.0.0.0:0)'
        Aug 27 11:51:59 ip-172-16-99-147 1 2026-08-27T11:51:59.997268+02:00 www-02 ansible-vbotka.freebsd.service 80592 - - Invoked with command=reload script=syslog-ng list_enabled=False synopsis=False wait=0.5 env=None jail=None
        Aug 27 11:50:04 ip-172-16-99-147 ansible: n=ansible WARNING| [WARNING]: Could not match supplied host pattern, ignoring: www-02
        Aug 27 11:50:04 ip-172-16-99-147 ansible: n=ansible INFO| PLAY [ansible-init] ************************************************************
        Aug 27 11:50:05 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Get hostname.] ***********************************************************
        Aug 27 11:50:05 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 11:50:06 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Get custom facts.] *******************************************************
        Aug 27 11:50:06 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 11:50:06 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Include variables from ai_vars directory.] *******************************
        Aug 27 11:50:06 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/project-hosts.yml)
        Aug 27 11:50:07 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Display vars.] ***********************************************************
        Aug 27 11:50:07 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] =>
        Aug 27 11:52:00 ip-172-16-99-147 ansible: |-
        Aug 27 11:52:00 ip-172-16-99-147 ansible: true
        Aug 27 11:52:00 ip-172-16-99-147 ansible: /root/ansible-vars
        Aug 27 11:52:00 ip-172-16-99-147 ansible: www-02
        Aug 27 11:52:00 ip-172-16-99-147 ansible: ['log-client']
        Aug 27 11:52:00 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', 'ansible_pull_syslogng_server': '172.16.99.31'}
        Aug 27 11:50:07 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Set ai_cmd] **************************************************************
        Aug 27 11:50:07 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 11:50:07 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Execute ai_cmd] **********************************************************
        Aug 27 11:50:07 ip-172-16-99-147 ansible: n=ansible INFO| included: /root/ansible-conf-init/tasks/execute-cmd.yml for localhost.my.domain
        Aug 27 11:50:07 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Display vars.] ***********************************************************
        Aug 27 11:50:07 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] =>
        Aug 27 11:52:00 ip-172-16-99-147 ansible: |-
        Aug 27 11:52:00 ip-172-16-99-147 ansible:
        Aug 27 11:52:00 ip-172-16-99-147 ansible: True
        Aug 27 11:52:00 ip-172-16-99-147 ansible:      ansible-pull -i hosts -U git://172.16.99.21/ansible-conf-syslogng-client -d /root/ansible-conf-syslogng-client -e "ai_vars=/root/ansible-vars" -e "ai_pull_mode=true" pb-logclient.yml &&  echo '[INFO] ansible-pull finished.'
        Aug 27 11:50:07 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Execute command async=3600 poll=0] ***************************************
        Aug 27 11:50:07 ip-172-16-99-147 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 11:50:07 ip-172-16-99-147 ansible: n=ansible INFO| PLAY RECAP *********************************************************************
        Aug 27 11:50:07 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 11:50:08 ip-172-16-99-147 ansible: n=ansible INFO| Starting Ansible Pull at 2026-08-27 11:50:08
        Aug 27 11:50:08 ip-172-16-99-147 ansible: n=ansible INFO| /usr/local/bin/ansible-pull -i hosts -U git://172.16.99.21/ansible-conf-syslogng-client -d /root/ansible-conf-syslogng-client -e ai_vars=/root/ansible-vars -e ai_pull_mode=true pb-logclient.yml
        Aug 27 11:50:09 ip-172-16-99-147 ansible: n=ansible WARNING| [WARNING]: Could not match supplied host pattern, ignoring: www-02
        Aug 27 11:50:10 ip-172-16-99-147 ansible: n=ansible INFO| localhost.my.domain | CHANGED => {
        Aug 27 11:52:00 ip-172-16-99-147 ansible: "6279622d9cef92c88a0c66814247d5e81b510542",
        Aug 27 11:52:00 ip-172-16-99-147 ansible: {
        Aug 27 11:52:00 ip-172-16-99-147 ansible: "/usr/local/bin/python3.12"
        Aug 27 11:52:00 ip-172-16-99-147 ansible:
        Aug 27 11:52:00 ip-172-16-99-147 ansible: null,
        Aug 27 11:52:00 ip-172-16-99-147 ansible: true
        Aug 27 11:52:00 ip-172-16-99-147 ansible:
        Aug 27 11:50:12 ip-172-16-99-147 ansible: n=ansible WARNING| [WARNING]: Could not match supplied host pattern, ignoring: www-02
        Aug 27 11:50:13 ip-172-16-99-147 ansible: n=ansible INFO| PLAY [Configure Log Client.] ***************************************************
        Aug 27 11:50:13 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Include variables from ai_vars directory.] *******************************
        Aug 27 11:50:13 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/project-hosts.yml)
        Aug 27 11:50:13 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Display vars.] ***********************************************************
        Aug 27 11:50:13 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain] =>
        Aug 27 11:52:00 ip-172-16-99-147 ansible: |-
        Aug 27 11:52:00 ip-172-16-99-147 ansible: true
        Aug 27 11:52:00 ip-172-16-99-147 ansible: /root/ansible-vars
        Aug 27 11:51:54 ip-172-16-99-147 ansible: n=ansible INFO| TASK [Install packages.] *******************************************************
        Aug 27 11:51:54 ip-172-16-99-147 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 11:51:56 ip-172-16-99-147 ansible: n=ansible INFO| TASK [vbotka.freebsd.postinstall : Rcconf: Configure syslogd_enable in /etc/rc.conf] ***
        Aug 27 11:51:56 ip-172-16-99-147 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 11:51:56 ip-172-16-99-147 ansible: n=ansible INFO| TASK [vbotka.freebsd.postinstall : Syslog-ng: Sanity fp_syslogng_conf is empty.] ***
        Aug 27 11:51:56 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 11:51:57 ip-172-16-99-147 ansible: n=ansible INFO| TASK [vbotka.freebsd.postinstall : Syslog-ng: Configure /usr/local/etc/syslog-ng.conf] ***
        Aug 27 11:51:57 ip-172-16-99-147 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 11:51:58 ip-172-16-99-147 ansible: n=ansible INFO| TASK [vbotka.freebsd.postinstall : Rcconf: Configure syslog_ng_enable in /etc/rc.conf] ***
        Aug 27 11:51:58 ip-172-16-99-147 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 11:51:59 ip-172-16-99-147 ansible: n=ansible INFO| RUNNING HANDLER [vbotka.freebsd.postinstall : Start syslog-ng] *****************
        Aug 27 11:51:59 ip-172-16-99-147 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 11:52:00 ip-172-16-99-147 syslog-ng[80567]: Loading the new configuration;
        Aug 27 11:52:00 ip-172-16-99-147 syslog-ng[80567]: Configuration reload finished;
        Aug 27 11:52:00 ip-172-16-99-147 1 2026-08-27T11:52:00.993936+02:00 www-02 ansible-vbotka.freebsd.service 80713 - - Invoked with command=stop script=syslogd list_enabled=False synopsis=False wait=0.5 env=None jail=None
        Aug 27 11:52:00 ip-172-16-99-147 ansible: n=ansible INFO| RUNNING HANDLER [vbotka.freebsd.postinstall : Reload syslog-ng] ****************
        Aug 27 11:52:00 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 11:52:01 ip-172-16-99-147 ansible: n=ansible INFO| RUNNING HANDLER [vbotka.freebsd.postinstall : Stop syslogd] ********************
        Aug 27 11:52:01 ip-172-16-99-147 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 11:52:01 ip-172-16-99-147 ansible: n=ansible INFO| PLAY RECAP *********************************************************************
        Aug 27 11:52:01 ip-172-16-99-147 ansible: n=ansible INFO| localhost.my.domain        : ok=10   changed=5    unreachable=0    failed=0    skipped=19   rescued=0    ignored=0
        Aug 27 11:52:02 ip-172-16-99-147 1 2026-08-27T11:52:02.897104+02:00 www-02 ansible-async_wrapper.py 78531 - - Module complete (78531)
        Aug 27 11:54:59 ip-172-16-99-147 1 2026-08-27T11:54:59.752963+02:00 www-02 dhclient 78102 - - DHCPREQUEST on epair0b to 172.16.99.1 port 67
        Aug 27 11:54:59 ip-172-16-99-147 1 2026-08-27T11:54:59.753561+02:00 www-02 dhclient 78102 - - DHCPACK from 172.16.99.1
        Aug 27 11:54:59 ip-172-16-99-147 1 2026-08-27T11:54:59.767516+02:00 www-02 dhclient 78102 - - bound to 172.16.99.147 -- renewal in 300 seconds.
        Aug 27 11:57:58 ip-172-16-99-147 1 2026-08-27T11:57:58.417655+02:00 www-02 ansible-ansible.legacy.command 82097 - - 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 11:57:58 ip-172-16-99-147 prg00000[1234]: seq: 0000000000, thread: 0000, runid: 1787824678, stamp: 2026-08-27T11:57:58 PADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADD

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ok: [log_server] => (item=['cat', '/var/log/remote/ip-172-16-99-116/2026_08_27.log']) => 
    msg: |-
        Aug 27 11:52:17 ip-172-16-99-116 syslog-ng[81403]: syslog-ng starting up; version='4.12.0'
        Aug 27 11:52:17 ip-172-16-99-116 syslog-ng[81403]: Syslog connection established; fd='19', server='AF_INET(172.16.99.10:514)', local='AF_INET(0.0.0.0:0)'
        Aug 27 11:52:18 ip-172-16-99-116 1 2026-08-27T11:52:18.618346+02:00 www-01 ansible-vbotka.freebsd.service 81428 - - Invoked with command=reload script=syslog-ng list_enabled=False synopsis=False wait=0.5 env=None jail=None
        Aug 27 11:49:52 ip-172-16-99-116 ansible: n=ansible WARNING| [WARNING]: Could not match supplied host pattern, ignoring: www-01
        Aug 27 11:49:52 ip-172-16-99-116 ansible: n=ansible INFO| PLAY [ansible-init] ************************************************************
        Aug 27 11:49:53 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Get hostname.] ***********************************************************
        Aug 27 11:49:53 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 11:49:55 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Get custom facts.] *******************************************************
        Aug 27 11:49:55 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 11:49:56 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Include variables from ai_vars directory.] *******************************
        Aug 27 11:49:56 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/project-hosts.yml)
        Aug 27 11:49:56 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Display vars.] ***********************************************************
        Aug 27 11:49:56 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] =>
        Aug 27 11:52:18 ip-172-16-99-116 ansible: |-
        Aug 27 11:52:18 ip-172-16-99-116 ansible: true
        Aug 27 11:52:18 ip-172-16-99-116 ansible: /root/ansible-vars
        Aug 27 11:52:18 ip-172-16-99-116 ansible: www-01
        Aug 27 11:52:18 ip-172-16-99-116 ansible: ['log-client']
        Aug 27 11:52:18 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', 'ansible_pull_syslogng_server': '172.16.99.31'}
        Aug 27 11:49:56 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Set ai_cmd] **************************************************************
        Aug 27 11:49:56 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 11:49:56 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Execute ai_cmd] **********************************************************
        Aug 27 11:49:56 ip-172-16-99-116 ansible: n=ansible INFO| included: /root/ansible-conf-init/tasks/execute-cmd.yml for localhost.my.domain
        Aug 27 11:49:56 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Display vars.] ***********************************************************
        Aug 27 11:49:56 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] =>
        Aug 27 11:52:18 ip-172-16-99-116 ansible: |-
        Aug 27 11:52:18 ip-172-16-99-116 ansible:
        Aug 27 11:52:18 ip-172-16-99-116 ansible: True
        Aug 27 11:52:18 ip-172-16-99-116 ansible:      ansible-pull -i hosts -U git://172.16.99.21/ansible-conf-syslogng-client -d /root/ansible-conf-syslogng-client -e "ai_vars=/root/ansible-vars" -e "ai_pull_mode=true" pb-logclient.yml &&  echo '[INFO] ansible-pull finished.'
        Aug 27 11:49:56 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Execute command async=3600 poll=0] ***************************************
        Aug 27 11:49:56 ip-172-16-99-116 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 11:49:56 ip-172-16-99-116 ansible: n=ansible INFO| PLAY RECAP *********************************************************************
        Aug 27 11:49:56 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 11:49:57 ip-172-16-99-116 ansible: n=ansible INFO| Starting Ansible Pull at 2026-08-27 11:49:57
        Aug 27 11:49:57 ip-172-16-99-116 ansible: n=ansible INFO| /usr/local/bin/ansible-pull -i hosts -U git://172.16.99.21/ansible-conf-syslogng-client -d /root/ansible-conf-syslogng-client -e ai_vars=/root/ansible-vars -e ai_pull_mode=true pb-logclient.yml
        Aug 27 11:49:58 ip-172-16-99-116 ansible: n=ansible WARNING| [WARNING]: Could not match supplied host pattern, ignoring: www-01
        Aug 27 11:49:59 ip-172-16-99-116 ansible: n=ansible INFO| localhost.my.domain | CHANGED => {
        Aug 27 11:52:18 ip-172-16-99-116 ansible: "6279622d9cef92c88a0c66814247d5e81b510542",
        Aug 27 11:52:18 ip-172-16-99-116 ansible: {
        Aug 27 11:52:18 ip-172-16-99-116 ansible: "/usr/local/bin/python3.12"
        Aug 27 11:52:18 ip-172-16-99-116 ansible:
        Aug 27 11:52:18 ip-172-16-99-116 ansible: null,
        Aug 27 11:52:18 ip-172-16-99-116 ansible: true
        Aug 27 11:52:18 ip-172-16-99-116 ansible:
        Aug 27 11:50:01 ip-172-16-99-116 ansible: n=ansible WARNING| [WARNING]: Could not match supplied host pattern, ignoring: www-01
        Aug 27 11:50:02 ip-172-16-99-116 ansible: n=ansible INFO| PLAY [Configure Log Client.] ***************************************************
        Aug 27 11:50:02 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Include variables from ai_vars directory.] *******************************
        Aug 27 11:50:02 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/project-hosts.yml)
        Aug 27 11:50:03 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Display vars.] ***********************************************************
        Aug 27 11:50:03 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain] =>
        Aug 27 11:52:18 ip-172-16-99-116 ansible: |-
        Aug 27 11:52:18 ip-172-16-99-116 ansible: true
        Aug 27 11:52:18 ip-172-16-99-116 ansible: /root/ansible-vars
        Aug 27 11:52:12 ip-172-16-99-116 ansible: n=ansible INFO| TASK [Install packages.] *******************************************************
        Aug 27 11:52:12 ip-172-16-99-116 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 11:52:14 ip-172-16-99-116 ansible: n=ansible INFO| TASK [vbotka.freebsd.postinstall : Rcconf: Configure syslogd_enable in /etc/rc.conf] ***
        Aug 27 11:52:14 ip-172-16-99-116 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 11:52:14 ip-172-16-99-116 ansible: n=ansible INFO| TASK [vbotka.freebsd.postinstall : Syslog-ng: Sanity fp_syslogng_conf is empty.] ***
        Aug 27 11:52:14 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 11:52:16 ip-172-16-99-116 ansible: n=ansible INFO| TASK [vbotka.freebsd.postinstall : Syslog-ng: Configure /usr/local/etc/syslog-ng.conf] ***
        Aug 27 11:52:16 ip-172-16-99-116 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 11:52:16 ip-172-16-99-116 ansible: n=ansible INFO| TASK [vbotka.freebsd.postinstall : Rcconf: Configure syslog_ng_enable in /etc/rc.conf] ***
        Aug 27 11:52:16 ip-172-16-99-116 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 11:52:18 ip-172-16-99-116 ansible: n=ansible INFO| RUNNING HANDLER [vbotka.freebsd.postinstall : Start syslog-ng] *****************
        Aug 27 11:52:18 ip-172-16-99-116 ansible: n=ansible INFO| changed: [localhost.my.domain]
        Aug 27 11:52:19 ip-172-16-99-116 syslog-ng[81403]: Loading the new configuration;
        Aug 27 11:52:19 ip-172-16-99-116 syslog-ng[81403]: Configuration reload finished;
        Aug 27 11:52:20 ip-172-16-99-116 1 2026-08-27T11:52:20.655563+02:00 www-01 ansible-vbotka.freebsd.service 81536 - - Invoked with command=stop script=syslogd list_enabled=False synopsis=False wait=0.5 env=None jail=None
        Aug 27 11:52:20 ip-172-16-99-116 ansible: n=ansible INFO| RUNNING HANDLER [vbotka.freebsd.postinstall : Reload syslog-ng] ****************
        Aug 27 11:52:20 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 11:52:21 ip-172-16-99-116 ansible: n=ansible INFO| RUNNING HANDLER [vbotka.freebsd.postinstall : Stop syslogd] ********************
        Aug 27 11:52:21 ip-172-16-99-116 ansible: n=ansible INFO| ok: [localhost.my.domain]
        Aug 27 11:52:21 ip-172-16-99-116 ansible: n=ansible INFO| PLAY RECAP *********************************************************************
        Aug 27 11:52:21 ip-172-16-99-116 ansible: n=ansible INFO| localhost.my.domain        : ok=10   changed=5    unreachable=0    failed=0    skipped=19   rescued=0    ignored=0
        Aug 27 11:52:22 ip-172-16-99-116 1 2026-08-27T11:52:22.583816+02:00 www-01 ansible-async_wrapper.py 77419 - - Module complete (77419)
        Aug 27 11:54:47 ip-172-16-99-116 1 2026-08-27T11:54:47.100759+02:00 www-01 dhclient 77032 - - DHCPREQUEST on epair0b to 172.16.99.1 port 67
        Aug 27 11:54:47 ip-172-16-99-116 1 2026-08-27T11:54:47.101448+02:00 www-01 dhclient 77032 - - DHCPACK from 172.16.99.1
        Aug 27 11:54:47 ip-172-16-99-116 1 2026-08-27T11:54:47.114265+02:00 www-01 dhclient 77032 - - bound to 172.16.99.116 -- renewal in 300 seconds.
        Aug 27 11:57:58 ip-172-16-99-116 1 2026-08-27T11:57:58.463501+02:00 www-01 ansible-ansible.legacy.command 82099 - - 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 11:57:58 ip-172-16-99-116 prg00000[1234]: seq: 0000000000, thread: 0000, runid: 1787824678, stamp: 2026-08-27T11:57:58 PADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADD

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ok: [log_server] => (item=['cat', '/var/log/remote/localhost/2026_08_27.log']) => 
    msg: |-
        Aug 27 11:57:46 localhost prg00000[1234]: seq: 0000000000, thread: 0000, runid: 1787824666, stamp: 2026-08-27T11:57:46 PADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADDPADD

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

PLAY RECAP *********************************************************************
log_server                 : 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/

Troubleshooting

  • See the Ansible logs /var/log/ansible.log in the jails.

shell > iocage console log-server
root@log-server:~ # cat /var/log/ansible.log
  • Update and pull the repositories. For example,

root@log-server:~ # cd /root/ansible-conf-init/
root@log-server:~/ansible-conf-init # git pull
Already up to date.
root@log-server: # cd /root/ansible-conf-syslogng-server/
root@log-server:~/ansible-conf-syslogng-server # git pull
Already up to date.
  • Start the service ansible_init

root@log-server:~ # service ansible_init start
Service ansible_init started.
Starting Ansible Pull at 2026-06-26 04:43:37
/usr/local/bin/ansible-pull -i hosts -U git://172.16.99.21/ansible-conf-init -d /root/ansible-conf-init -e ai_vars=/root/ansible-vars -e ai_pull_mode=true pb-init.yml
[WARNING]: Could not match supplied host pattern, ignoring: localhost.my.domain
[WARNING]: Could not match supplied host pattern, ignoring: log-server

...
TASK [Display vars.] ***********************************************************
ok: [localhost.my.domain] =>
    msg: |-
        ai_at:
        ai_async: True
        ai_cmd:      ansible-pull -i hosts -U git://172.16.99.21/ansible-conf-syslogng-server -d /root/ansible-conf-syslogng-server -e "ai_vars=/root/ansible-vars" -e "ai_pull_mode=true" pb-logserv.yml &&  echo '[INFO] ansible-pull finished.'

TASK [Execute command async=3600 poll=0] ***************************************
changed: [localhost.my.domain]

PLAY RECAP *********************************************************************
localhost.my.domain        : ok=8    changed=1    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0

Note

The command service ansible_init start removes the the sentinel file /firstboot.

  • See the Ansible log /var/log/ansible.log. The warnings are harmless.

root@log-server:~ # cat /var/log/ansible.log
...
2026-06-26 04:31:12,561 p=21489 u=root n=ansible INFO| Starting Ansible Pull at 2026-06-26 04:31:12
2026-06-26 04:31:12,561 p=21489 u=root n=ansible INFO| /usr/local/bin/ansible-pull -i hosts -U git://172.16.99.21/ansible-conf-syslogng-server -d /root/ansible-conf-syslogng-server -e ai_vars=/root/ansible-vars -e ai_pull_mode=true pb-logserv.yml
2026-06-26 04:31:13,041 p=21491 u=root n=ansible WARNING| [WARNING]: Could not match supplied host pattern, ignoring: log-server
...
2026-06-26 04:43:45,845 p=28341 u=root n=ansible INFO| PLAY [Configure and start Log Server.] *****************************************
2026-06-26 04:43:45,880 p=28341 u=root n=ansible INFO| TASK [Include variables from ai_vars directory.] *******************************
2026-06-26 04:43:45,880 p=28341 u=root n=ansible INFO| ok: [localhost.my.domain] => (item=/root/ansible-vars/project-hosts.yml)
2026-06-26 04:43:45,922 p=28341 u=root n=ansible INFO| TASK [Display vars.] ***********************************************************
2026-06-26 04:43:45,922 p=28341 u=root n=ansible INFO| ok: [localhost.my.domain] =>
    msg: |-
        ai_pull_mode: true
        ai_vars: /root/ansible-vars

2026-06-26 04:43:50,042 p=28341 u=root n=ansible INFO| TASK [Install packages.] *******************************************************
2026-06-26 04:43:50,043 p=28341 u=root n=ansible INFO| ok: [localhost.my.domain]
2026-06-26 04:43:50,820 p=28341 u=root n=ansible INFO| TASK [vbotka.freebsd.postinstall : Rcconf: Configure syslogd_enable in /etc/rc.conf] ***
2026-06-26 04:43:50,821 p=28341 u=root n=ansible INFO| ok: [localhost.my.domain]
2026-06-26 04:43:50,919 p=28341 u=root n=ansible INFO| TASK [vbotka.freebsd.postinstall : Syslog-ng: Sanity fp_syslogng_conf is empty.] ***
2026-06-26 04:43:50,920 p=28341 u=root n=ansible INFO| ok: [localhost.my.domain]
2026-06-26 04:43:51,585 p=28341 u=root n=ansible INFO| TASK [vbotka.freebsd.postinstall : Syslog-ng: Configure /usr/local/etc/syslog-ng.conf] ***
2026-06-26 04:43:51,586 p=28341 u=root n=ansible INFO| ok: [localhost.my.domain]
2026-06-26 04:43:51,955 p=28341 u=root n=ansible INFO| TASK [vbotka.freebsd.postinstall : Rcconf: Configure syslog_ng_enable in /etc/rc.conf] ***
2026-06-26 04:43:51,955 p=28341 u=root n=ansible INFO| ok: [localhost.my.domain]
2026-06-26 04:43:52,004 p=28341 u=root n=ansible INFO| PLAY RECAP *********************************************************************
2026-06-26 04:43:52,004 p=28341 u=root n=ansible INFO| localhost.my.domain        : ok=7    changed=0    unreachable=0    failed=0    skipped=19   rescued=0    ignored=0