- install source
$ git clone http://github.com/onlybooks/kafka2
- construct practice environment (ansible + docker compose)
- install ansible
$ pip install ansible
-
docker compose + ansible playbook
-
before apply cache
33274 2026-03-30 22:50:25 ansible-playbook -i hosts site.yml
33275 2026-03-30 23:14:40 date -Isecond
- after apply cache
33309 2026-03-30 23:34:18 ansible-playbook -i hosts site.yml
33310 2026-03-30 23:35:42 date -Isecond
- make cache
- pre download tgz
- install java in Docker file
$ mkdir kafka-cache
$ cd kafka-cache
$ ls
$ cdg
$ cd kafka2/chapter2/ansible_playbook/kafka-cache/
$ wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz
$ wget https://archive.apache.org/dist/kafka/2.6.0/kafka_2.12-2.6.0.tgz
chapter2/ansible_playbook/.gitignore --- Text
1 kafka-cache/apache-zookeeper-3.5.9-bin.tar.gz
2 kafka-cache/kafka_2.12-2.6.0.tgz
3
chapter2/ansible_playbook/Dockerfile --- Text
1 FROM rockylinux:9
2 RUN dnf -y install systemd python3 sudo \
3 dstat java-1.8.0-openjdk java-1.8.0-openjdk-devel \
4 krb5-workstation git && \
5 dnf clean all
6 RUN useradd -m ec2-user && \
7 echo "ec2-user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
8 RUN systemctl mask \
9 dev-hugepages.mount \
10 sys-fs-fuse-connections.mount \
11 systemd-update-utmp.service \
12 systemd-tmpfiles-setup.service \
13 getty.target \
14 console-getty.service
15 STOPSIGNAL SIGRTMIN+3
16 CMD ["/usr/sbin/init"]
17
chapter2/ansible_playbook/docker-compose.yml --- YAML
1 services:
2 peter-zk01:
3 build: .
4 container_name: peter-zk01
5 hostname: peter-zk01.foo.bar
6 privileged: true
7 volumes:
8 - ./kafka-cache:/opt/kafka-cache:ro
9 networks:
10 kafka-net:
11 aliases:
12 - peter-zk01.foo.bar
13 peter-zk02:
14 build: .
15 container_name: peter-zk02
16 hostname: peter-zk02.foo.bar
17 privileged: true
18 volumes:
19 - ./kafka-cache:/opt/kafka-cache:ro
20 networks:
21 kafka-net:
22 aliases:
23 - peter-zk02.foo.bar
24 peter-zk03:
25 build: .
26 container_name: peter-zk03
27 hostname: peter-zk03.foo.bar
28 privileged: true
29 volumes:
30 - ./kafka-cache:/opt/kafka-cache:ro
31 networks:
32 kafka-net:
33 aliases:
34 - peter-zk03.foo.bar
35 peter-kafka01:
36 build: .
37 container_name: peter-kafka01
38 hostname: peter-kafka01.foo.bar
39 privileged: true
40 volumes:
41 - ./kafka-cache:/opt/kafka-cache:ro
42 networks:
43 kafka-net:
44 aliases:
45 - peter-kafka01.foo.bar
46 peter-kafka02:
47 build: .
48 container_name: peter-kafka02
49 hostname: peter-kafka02.foo.bar
50 privileged: true
51 volumes:
52 - ./kafka-cache:/opt/kafka-cache:ro
53 networks:
54 kafka-net:
55 aliases:
56 - peter-kafka02.foo.bar
57 peter-kafka03:
58 build: .
59 container_name: peter-kafka03
60 hostname: peter-kafka03.foo.bar
61 privileged: true
62 volumes:
63 - ./kafka-cache:/opt/kafka-cache:ro
64 networks:
65 kafka-net:
66 aliases:
67 - peter-kafka03.foo.bar
68
69 networks:
70 kafka-net:
71 driver: bridge
72
chapter2/ansible_playbook/hosts --- Text
1 [zkhosts] 1 [zkhosts]
2 peter-zk01.foo.bar 2 peter-zk01.foo.bar ansible_connection=docker ansible_host=peter-zk01
3 peter-zk02.foo.bar 3 peter-zk02.foo.bar ansible_connection=docker ansible_host=peter-zk02
4 peter-zk03.foo.bar 4 peter-zk03.foo.bar ansible_connection=docker ansible_host=peter-zk03
5 5
6 [kafkahosts] 6 [kafkahosts]
7 peter-kafka01.foo.bar 7 peter-kafka01.foo.bar ansible_connection=docker ansible_host=peter-kafka01
8 peter-kafka02.foo.bar 8 peter-kafka02.foo.bar ansible_connection=docker ansible_host=peter-kafka02
9 peter-kafka03.foo.bar 9 peter-kafka03.foo.bar ansible_connection=docker ansible_host=peter-kafka03
10 10
11 [kerberoshosts] 11 [kerberoshosts]
12 peter-zk01.foo.bar 12 peter-zk01.foo.bar ansible_connection=docker ansible_host=peter-zk01
chapter2/ansible_playbook/kafka-cache/.gitkeep --- Text
No changes.
chapter2/ansible_playbook/roles/kafka/tasks/main.yml --- YAML
16 state: directory 16 state: directory
17 mode: '0755' 17 mode: '0755'
18 18
19 - name: download kafka from web 19 - name: copy kafka from local cache
20 get_url: 20 copy:
21 url: https://archive.apache.org/dist/kafka//kafka_2.12-.tgz 21 src: /opt/kafka-cache/kafka_2.12-.tgz
22 dest: /opt/ 22 dest: /opt/kafka_2.12-.tgz
23 mode: '0600' 23 mode: '0600'
.. 24 remote_src: yes
24 25
25 - name: unarchive kafka 26 - name: unarchive kafka
26 unarchive: 27 unarchive:
chapter2/ansible_playbook/roles/zookeeper/tasks/main.yml --- YAML
29 group: zookeeper 29 group: zookeeper
30 mode: '0755' 30 mode: '0755'
31 31
32 - name: download zookeeper from web 32 - name: copy zookeeper from local cache
33 get_url: 33 copy:
34 url: https://archive.apache.org/dist/zookeeper//apache--bin.tar.gz 34 src: /opt/kafka-cache/apache--bin.tar.gz
35 dest: /opt/ 35 dest: /opt/apache--bin.tar.gz
36 mode: '0600' 36 mode: '0600'
.. 37 remote_src: yes
37 38
38 - name: unarchive zookeeper 39 - name: unarchive zookeeper
39 unarchive: 40 unarchive:
[root@peter-kafka01 /]# ls /usr/local/kafka/bin/kafka-topics.sh
/usr/local/kafka/bin/kafka-topics.sh
[root@peter-kafka01 /]# /usr/local/kafka/bin/kafka-topics.sh --bootstrap-server peter-kafka01.foo.bar:9092 --create --topic peter-overview01 --partitions 1 --replication-factor 3
Created topic peter-overview01.
[root@peter-kafka01 /]# /usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server peter-kafka01.foo.bar:9092 --topic peter-overview01
First message
[root@peter-kafka01 /]# /usr/local/kafka/bin/kafka-console-producer.sh --bootstrap-server peter-kafka01.foo.bar:9092 --topic peter-overview01
>First message