Small utility to control Ceph cluster configuration just like any other declarative configuration
- Easy-to-use healthcheck which may contain checks against status & configuration and indicate some some not trivial issues
- Declarative configuration support which is apply only if needed
- Diff configuration: check what the difference between currently running configuration and desired or migrated from other cluster
$ ./cephctl
usage: cephctl [<flags>] <command> [<args> ...]
Small utility to control Ceph cluster configuration just like any other declarative configuration
Flags:
--[no-]help Show context-sensitive help (also try --help-long and --help-man).
-b, --ceph-binary="/usr/bin/ceph"
Specify path to ceph binary ($CEPHCTL_CEPH_BINARY)
-d, --[no-]debug Enable debug mode ($CEPHCTL_DEBUG)
-t, --[no-]trace Enable trace mode (debug mode on steroids) ($CEPHCTL_TRACE)
-c, --[no-]color Colorize diff output ($CEPHCTL_COLOR)
Commands:
help [<command>...]
Show help.
apply <filename>
Apply ceph configuration
diff <filename>
Show difference between running and desired configurations
dump cephconfig
dump Ceph runtime configuration
dump cephosdconfig
dump Ceph OSD configuration
healthcheck
Perform a cluster healthcheck and print report
version
Print version and exit
Cephctl uses native Ceph CLIs to work with cluster configuration so it's require
to have Ceph binaries w/ configured ceph.conf
. Alternatively it's possible
to adjust ceph
binary path to access ceph in container and/or remote machine.
- v0.0.0
- Apply declarative configuration for
ceph config
- Dump cluster configuration to CephConfig specification
- Diff configuration against running configuration for
ceph config
- Perform healthcheck based on current cluster status
- Add healthchecks based on current cluster configuration
- Apply declarative configuration for
- v0.1.0
- Additional healthchecks based on hardware status
- FreeBSD support in builds
- Remote Ceph cluster access via SSH
- v0.2.0
- Apply/Dump declarative configuration for
ceph osd set-*
stuff
- Apply/Dump declarative configuration for
- v0.3.0
- Apply/Dump declarative configuration for Ceph Object Gateway (rgw)
- v0.4.0
- Apply/Dump declarative configuration for Pools
- v0.5.0
- Live balancing PGs across OSDs
All of the changes are tested against Ceph 18.2 (Reef), previous versions are not tested and not guaranteed to work.
If you gonna use cephctl as a library for your purposes please feel free to but please note a few things:
- Cephctl doesn't use internal packages to allow you to do whatever you like. Cephctl project doesn't aim to limit your usage.
- Internal program interfaces are not guaranteed to be stable between releases since they're written and serve for internal purposes.
- CLI interface (until 1.0.x at least) is also not guaranteed to be stable: subcommands and options are subjects to change between versions.
cephctl is released in following ways to achieve compatibility and provide an easy way for end users.
Pre-compiled binaries are available on per-release basis and provided on GitHub Releases page. Automatically generated changelog is available for each release. And binaries are available for:
- FreeBSD (amd64v1, amd64v2, amd64v3, arm64)
- Linux (amd64v1, amd64v2, amd64v3, arm64)
- macOS (amd64v1, amd64v2, amd64v3, arm64)
- Windows (amd64v1, amd64v2, amd64v3, arm64)
Any of them could be used on end-user machine to interact with Ceph via SSH just like the following way:
cephctl --ceph-binary='ssh mon01 ceph' healthcheck
or by using environment variables to specify ceph binary:
export CEPHCTL_CEPH_BINARY='ssh mon01 ceph'
cephctl healthcheck
Since cephctl uses ceph binary to achieve cluster data, container image based
on ceph official release image is also available. This image is designed as
drop-in replacement for official ceph image to use for cephadm shell
command.
Container image is available at GitHub Packages
To replace official Ceph image with the one containing cephctl in cephadm clusters just do:
# Set container image as a global parameter to all components
ceph config set mgr mgr/cephadm/container_image_base ghcr.io/runityru/cephctl/ceph
# Run upgrade procedure
ceph orch upgrade start --ceph_version=18.2.2
Please note Ceph orch will automatically replace container_image
parameter
for each component with specific sha256 image ID instead of tag we defined
manually. It's OK and it's a guarantee the image won't be changed in your
cluster.
It's possible to build cephctl from source by simply running the following command:
goreleaser build --snapshot --clean
or manually via Go compiler
go build -v -ldflags="-X 'main.appVersion=$(git rev-parse --short HEAD) (trunk build)' -X 'main.buildTimestamp=$(date -u +%Y-%m-%dT%H:%m:%SZ)'" -o dist/cephctl ./cmd/cephctl/...
cephctl is an open source project so you have the following ways to contribute:
- Documentation
- Fill issues
- Fix bugs
- Suggest/implement new features
- Or any other way, if you have any doubts please fill free to open discussion
There's no actually a particular guidelines for the code but there are some common rules about it based on TDD, DDD and SOLID, the list could be extended:
Each abstraction layer should be isolated: transport layer from data layer, DTO models from business logic models and so on.
Since we gonna have amount of packages we can easily write tests, please don't ignore such ability.
In many projects I've seen how test are using system-wide configuration files, system-wide binaries and so on - I think this is a bad, insecure, unsafe and irreproducible practice not allowing to be sure the tests are passed in new environment (on a new developer machine for instance).
So all the tests in cephctl are isolated:
- code running any commands runs scripts in tests emulating the expected behavior
- command output payload is gathered from real installations
- the only thing you need to run tests is go compiler