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
At a managed node:
In the playbook vbotka.freebsd.pb_iocage_project_create_from_templates.yml create jails from the template.
ansible-init.Wait for
ansible-pullto configure the jails and display the logs.
Requirements
template
ansible-initcreated in 524 iocage template ansible-initplaybook vbotka.freebsd.pb_iocage_project_create_from_templates.yml
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.
See also
The option
firstboot_sentinelin man rc.confThe example 523 iocage template ansible-repos
GitHub repositories:
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
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
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
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
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.login 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