This guide provides a full Ansible playbook to install Apache Kafka with KRaft mode (no ZooKeeper) for Debian 10+, Ubuntu LTS, and RHEL 9+ compatible systems.
- name: Install Apache Kafka
hosts: kafka
become: true
vars:
kafka_version: "4.2.0"
kafka_download_url: "https://dlcdn.apache.org/kafka/4.2.0/kafka_2.13-4.2.0.tgz"
kafka_install_dir: /opt/kafka
kafka_user: kafka
kafka_group: kafka
kafka_node_id: "1"
kafka_listeners: "PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093"
kafka_advertised_listeners: "PLAINTEXT://localhost:9092"
tasks:
- name: Install Java (Debian/Ubuntu)
apt:
name:
- openjdk-17-jdk
state: present
update_cache: true
when: ansible_os_family == "Debian"
- name: Install Java (RHEL family)
dnf:
name:
- java-17-openjdk-devel
state: present
when: ansible_os_family == "RedHat"
- name: Create Kafka group
group:
name: "{{ kafka_group }}"
state: present
- name: Create Kafka user
user:
name: "{{ kafka_user }}"
group: "{{ kafka_group }}"
shell: /usr/sbin/nologin
system: yes
create_home: no
- name: Download Kafka
get_url:
url: "{{ kafka_download_url }}"
dest: /tmp/kafka_2.13-{{ kafka_version }}.tgz
mode: '0644'
become_user: "{{ kafka_user }}"
- name: Extract Kafka
unarchive:
src: /tmp/kafka_2.13-{{ kafka_version }}.tgz
dest: "{{ kafka_install_dir }}"
remote_src: yes
owner: "{{ kafka_user }}"
group: "{{ kafka_group }}"
extra_opts: [--strip-components=1]
- name: Create data directory
file:
path: "{{ kafka_install_dir }}/data"
state: directory
owner: "{{ kafka_user }}"
group: "{{ kafka_group }}"
mode: '0755'
- name: Configure server.properties for KRaft
copy:
dest: "{{ kafka_install_dir }}/config/server.properties"
mode: '0644'
owner: "{{ kafka_user }}"
group: "{{ kafka_group }}"
content: |
node.id={{ kafka_node_id }}
process.roles=broker,controller
controller.quorum.voters={{ kafka_node_id }}@localhost:9093
listeners={{ kafka_listeners }}
advertised.listeners={{ kafka_advertised_listeners }}
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
controller.listener.names=CONTROLLER
inter.broker.listener.name=PLAINTEXT
log.dirs={{ kafka_install_dir }}/data
num.partitions=1
default.replication.factor=1
min.insync.replicas=1
- name: Format storage directory for KRaft
command: "{{ kafka_install_dir }}/bin/kafka-storage.sh format -t $(cat /proc/sys/kernel/random/uuid) -c {{ kafka_install_dir }}/config/server.properties"
become_user: "{{ kafka_user }}"
args:
creates: "{{ kafka_install_dir }}/data/meta.properties"
- name: Create systemd service
copy:
dest: /etc/systemd/system/kafka.service
mode: '0644'
content: |
[Unit]
Description=Apache Kafka
After=network.target
[Service]
Type=simple
User={{ kafka_user }}
Group={{ kafka_group }}
ExecStart={{ kafka_install_dir }}/bin/kafka-server-start.sh {{ kafka_install_dir }}/config/server.properties
ExecStop={{ kafka_install_dir }}/bin/kafka-server-stop.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
- name: Reload systemd
systemd:
daemon_reload: yes
- name: Enable and start Kafka
systemd:
name: kafka
state: started
enabled: yes
- name: Verify Kafka is running
command: "{{ kafka_install_dir }}/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:9092"
register: kafka_status
changed_when: false
failed_when: false
become_user: "{{ kafka_user }}"
- name: Show Kafka broker info
debug:
var: kafka_status.stdout_lines[:5]
| Variable | Default | Description |
|---|---|---|
kafka_version |
4.2.0 |
Kafka version to install |
kafka_install_dir |
/opt/kafka |
Installation directory |
kafka_user |
kafka |
System user for Kafka |
kafka_group |
kafka |
System group for Kafka |
kafka_node_id |
1 |
Unique node ID for KRaft |
kafka_listeners |
See above | Listener configuration |
kafka_advertised_listeners |
PLAINTEXT://localhost:9092 |
Advertised listeners |
Any questions?
Feel free to contact us. Find all contact information on our contact page.