source/projects/kook
2021-09-19 18:05:22 -06:00
..
.eggs Add kook as-is 2021-08-03 08:43:19 -06:00
bin Add kook as-is 2021-08-03 08:43:19 -06:00
src/kook Fmt. 2021-09-19 18:05:22 -06:00
test Add kook as-is 2021-08-03 08:43:19 -06:00
.editorconfig Add kook as-is 2021-08-03 08:43:19 -06:00
kook-archive.json Add kook as-is 2021-08-03 08:43:19 -06:00
LICENSE.md Add kook as-is 2021-08-03 08:43:19 -06:00
README.md Add kook as-is 2021-08-03 08:43:19 -06:00
setup.py Add kook as-is 2021-08-03 08:43:19 -06:00
test.sh Add kook as-is 2021-08-03 08:43:19 -06:00

Kook

I AM NOT A LOONY!

~ John Cleese

Apache Zookeeper is a mature distributed coordination system, providing locking, monitoring, leader election and other such capabilities comparable to Google Chubby in many ways. Google has deployed Chubby to solve a number of interesting problems around service discovery (DNS), leadership management & coarse coordination, as well as cluster membership and configuration management. While these problems prima face appear to be unrelated, they have deep similarities in the requirements they introduce for reliability, and the distributed consensus capabilities needed to offer them.

Kook is a Python library - backed by the Kazoo Zookeeper client - which sketches at a leveraging a Zookeeper cluster to build out host management and coordination capabilities.

Kook's data model consists of hosts and groups.

A host is a model of a physical device. It has key/value storage in the form of attributes and may be a member of one or more groups. Groups likewise have attributes and may themselves be members (children) of other groups.

>>> from kook.client import KookClient
>>> client = KookClient(hosts="zookeeper:2181")
>>> client.servers()
>>> client.hosts()
[<KookHost '/server/ethos'>,
 <KookHost '/server/pathos'>,
 <KookHost '/server/logos'>,
 ...]
>>> client.server("ethos").groups()
[<KookGroup '/group/hw_ryzen0'>,
 <KookGroup '/group/geo_apartment'>,
 <KookGroup '/group/apartment_git'>,
 <KookGroup '/group/apartment_www'>]

With Ansible

The import_inventory.py script can be used to convert an existing Ansible inventory into host and group records in Kook. The script contains shims for importing both host vars and group vars. However kook is only intended for tracking slow-moving host level vars, and group membership. I believe configuration data (group vars) should be on groups, and live in source control. Only inventory and membership should be fast-enough moving to live in Zookeeper.

The kook_inventory.py script uses the KookClient to provide an Ansible dynamic inventory. To use kook_inventory.py with Ansible, you'll need the following lines in your ansible.cfg:

[default]
inventory = kook_inventory.py
...

[inventory]
enable_plugins = script
...

This tells Ansible to use the kook_inventory.py script as its sole source of inventory.

Status

Kook is currently prototype-grade. The client works, the inventory script works. The kook CLI script is woefully incomplete.

Both the client and client and inventory feature significant limitations. Zookeeper really wasn't designed for a "full scan" workload like this. It's a coordination system not a database - for all it may seem appropriate to overload its usage. Really making this viable would require a meaningful effort to leverage client-side data caching.

The real concern is improving the locking story, using watches to update fetched nodes rather than re-fetching every time. For coarse-grained actions on slow moving inventory the current naive strategies should be close enough to correct.

License

Published under the MIT license.