sleighzy.zookeeper
Apache ZooKeeper
用于安装和配置 Apache ZooKeeper 的 Ansible 角色
此角色可用于安装和集群多个 ZooKeeper 节点,默认情况下使用清单文件中“zookeeper-nodes”组定义的所有主机。所有服务器将与领导者和选举端口一起添加到 zoo.cfg 文件中。在将 zookeeper_firewalld
变量设置为 true
后,可以打开防火墙端口。
支持的平台
- Debian 10.x
- RedHat 7
- RedHat 8
- Ubuntu 18.04.x
- Ubuntu 20.04.x
需求
Java: Java 8 / 11
Ansible 2.9.16 或 2.10.4 是解决某些内核中 systemd
状态检查问题的最低版本。在尝试通过 Ansible 角色启动服务时,会输出错误信息“Service is in unknown state
”,任务将失败。如果在物理主机上运行 systemctl start
命令,服务将如预期启动。有关更多信息,请参见 https://github.com/ansible/ansible/issues/71528。
角色变量
变量 | 默认值 | 备注 |
---|---|---|
zookeeper_mirror | https://dlcdn.apache.org/zookeeper | |
zookeeper_version | 3.9.1 | |
zookeeper_package | apache-zookeeper-{{ zookeeper_version }}-bin.tar.gz | |
zookeeper_group | zookeeper | |
zookeeper_user | zookeeper | |
zookeeper_root_dir | /usr/share | |
zookeeper_install_dir | '{{ zookeeper_root_dir}}/apache-zookeeper-{{zookeeper_version}}' | |
zookeeper_dir | '{{ zookeeper_root_dir }}/zookeeper' | |
zookeeper_log_dir | /var/log/zookeeper | |
zookeeper_data_dir | /var/lib/zookeeper | |
zookeeper_data_log_dir | /var/lib/zookeeper | |
zookeeper_client_port | 2181 | |
zookeeper_id | 1 | 每台服务器唯一,应在清单文件中声明 |
zookeeper_leader_port | 2888 | |
zookeeper_election_port | 3888 | |
zookeeper_servers | zookeeper-nodes | 见下文 |
zookeeper_servers_use_inventory_hostname | false | 见下文 |
zookeeper_environment | "JVMFLAGS": "-javaagent:/opt/jolokia/jolokia-jvm-1.6.0-agent.jar" | |
zookeeper_config_params | 将被模板化到 zoo.cfg 的键值字典 | |
zookeeper_firewalld | false |
清单和 zookeeper_servers 变量
上述 zookeeper_servers 变量接受一个清单主机名的列表。这些将用于 zoo.cfg
来配置多服务器集群,以便主机能够相互发现。默认情况下,zoo.cfg
中使用的主机名为服务器上 hostname
命令所报告的主机名(由 ansible_nodename
变量提供)。请看下面的示例。
假设以下清单文件,并且 hostname
命令仅返回主机名,而不包含域名。
[zookeeper-nodes]
zoo1.foo.com zookeeper_id=1 # hostname 命令返回 "zoo1"
zoo2.foo.com zookeeper_id=2 # hostname 命令返回 "zoo2"
zoo3.foo.com zookeeper_id=3 # hostname 命令返回 "zoo3"
假设以下角色变量:
---
- role: sleighzy.zookeeper
zookeeper_servers:
- zoo1.foo.com
- zoo2.foo.com
- zoo3.foo.com
模板化的 zoo.cfg
文件将包含以下条目:
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
如果您不希望有这种行为,并希望 zoo.cfg
模板化清单主机名,请将 zookeeper_servers_use_inventory_hostname
设置为 true
。
默认端口
端口 | 描述 |
---|---|
2181 | 客户端连接端口 |
2888 | 集群的法定投票端口 |
3888 | 集群的领导选举端口 |
默认目录和文件
描述 | 目录 / 文件 |
---|---|
安装目录 | /usr/share/apache-zookeeper-<version> |
指向安装目录的符号链接 | /usr/share/zookeeper |
指向配置的符号链接 | /etc/zookeeper/zoo.cfg |
日志文件 | /var/log/zookeeper |
快照和 myid 文件的数据目录 | /var/lib/zookeeper |
事务日志文件的数据目录 | /var/lib/zookeeper |
Systemd 服务 | /usr/lib/systemd/system/zookeeper.service |
系统默认值 | /etc/default/zookeeper |
启动和停止 ZooKeeper 服务
- ZooKeeper 服务可以通过
systemctl start zookeeper
启动 - ZooKeeper 服务可以通过
systemctl stop zookeeper
停止
四字命令
ZooKeeper 可以使用基于四字母单词的命令,详见 https://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_4lw
以下示例使用 stat 命令来找出哪个实例是领导者:
for i in 1 2 3 ; do
echo "zookeeper0$i 是 "$(echo stat | nc zookeeper0$i 2181 | grep ^Mode | awk '{print $2}');
done
依赖
无依赖项
示例剧本
- hosts: zookeeper-nodes
roles:
- sleighzy.zookeeper
代码检查
代码检查应使用 ansible-lint 进行
pip3 install ansible-lint --user
ansible-lint -c ./.ansible-lint .
测试
该模块使用 Ansible Molecule 测试框架。此测试套件创建一个由三个节点组成的 ZooKeeper 集群,运行在 Docker 容器中。每个容器运行不同的操作系统,以测试对该 Ansible 角色的支持平台。
按照 [Molecule 安装指南],这应在虚拟环境中完成。以下命令将创建一个 Python 虚拟环境并安装 Molecule 及 Docker 驱动程序。
$ python3 -m venv molecule-venv
$ source molecule-venv/bin/activate
(molecule-venv) $ pip3 install ansible docker "molecule-plugins[docker]"
运行剧本和测试。必须在运行 Molecule 执行任何测试之前修正代码检查错误。将运行所有测试,然后销毁 Docker 容器。
molecule test
以下命令可用于在不进行测试的情况下运行剧本。在对角色进行更改并确保操作是幂等时,可以多次运行此命令。
molecule converge
以下命令可用于只运行测试而不销毁一切。命令 molecule verify
可以在每次测试运行时重复。
molecule create
molecule converge
molecule verify
销毁 Molecule 测试和 Docker 容器。
molecule destroy
许可证
![MIT 许可证]
ansible-galaxy install sleighzy.zookeeper