Service ansible_init
Introduction
ansible_init is a lightweight, cloud-init style FreeBSD rc(8) initialization service designed for the unattended, automated configuration of freshly deployed FreeBSD instances.
By leveraging the native FreeBSD firstboot framework and Ansible’s pulling
execution model (ansible-pull), this service eliminates the need for an
external orchestration server to push configuration changes. Instead, the newly
booted system configures itself locally.
High-level architecture
The service coordinates the handover between system initialization and configuration management:
[ Provisioning Layer ] ──> Instance Boots ──> rc.d/ansible_init runs
│
▼
Clones Remote Git Repository
│
▼
Executes Playbook Locally
│
▼
[ System Fully Configured ]
Bootstrap Condition: The script is flagged with the “KEYWORD: firstboot” macro. It triggers dynamically on systems where the marker file /firstboot exists in the root directory.
Execution Hook: It blocks the final multi-user runlevel sequence until the networking layer is available (REQUIRE: NETWORKING).
Local Compilation: Rather than exposing an open SSH port for an internal control node, ansible_init pulls down your infrastructure-as-code repository via standard Git/HTTPS channels, compiles variables locally, and executes the target playbooks against localhost.
Self-Termination: Upon a successful complete execution, the underlying FreeBSD firstboot framework removes the /firstboot trigger file, ensuring the initialization tasks run exactly once in the lifecycle of the instance.
Example
This example demonstrates how to bootstrap a FreeBSD system within an isolated provisioning network using a local Git daemon.
What This Example Accomplishes
It creates an infrastructure-as-code repository containing a custom Ansible configuration, inventory file, and an example playbook.
It configures the host to export this repository over the lightweight, unauthenticated git:// protocol.
It configures the ansible_init rc service to hook into that local repository.
Upon execution, ansible-pull clones the repository and executes a task that generates a file (/tmp/ansible-hello-world.txt).
Install Git and create local Git repository
# ls -la /usr/local/git/ansible-conf-example/
total 230
drwxr-xr-x 3 git_daemon git_daemon 6 Jul 2 11:05 .
drwxr-xr-x 7 git_daemon git_daemon 7 Jul 2 10:55 ..
drwxr-xr-x 7 git_daemon git_daemon 12 Jul 2 11:07 .git
-rw-r--r-- 1 git_daemon git_daemon 65 Jul 2 10:59 ansible.cfg
-rw-r--r-- 1 git_daemon git_daemon 35 Jul 2 10:48 hosts
-rw-r--r-- 1 git_daemon git_daemon 211 Jul 2 10:48 pb-example.yml
See also
The Example
Configure git_daemon in /etc/rc.conf and start it
git_daemon_enable="YES"
git_daemon_directory="/usr/local/git"
git_daemon_flags="--syslog --base-path=/usr/local/git --export-all --reuseaddr --detach"
Configure ansible_init in /etc/rc.conf
ansible_init_enable="YES"
ansible_init_host="git://localhost"
ansible_init_repo="ansible-conf-example"
ansible_init_playbook="pb-example.yml"
Start ansible_init
# service ansible_init start
The ansible-pull execution clones the repository into the local
directory /root/ansible-conf-example and executes the playbook. As a result,
the file /tmp/ansible-hello-world.txt is created:
# cat /tmp/ansible-hello-world.txt
[ansible-test] Hello world!
See also
repository ansible_init
repository ansible-conf-init-example
repository ansible-conf-test
example 524 iocage template ansible-init
Warning
The git:// protocol does not support encryption or authentication. While perfect for fast local prototyping or isolated provisioning networks, you should change your ansible_init_host parameter to https:// for production deployments.