Reclass Formula¶
reclass is an “external node classifier” (ENC) as can be used with automation tools, such as Puppet, Salt, and Ansible. It is also a stand-alone tool for merging data sources recursively.
Sample Metadata¶
Install sources from [repository, git, pip]
salt:
source:
engine: pkg
...
source:
engine: git
repo: git+https://github.com/salt-formulas/reclass
branch: master
...
source:
engine: pip
...
If reclass is pre-installed, set the engine to None to avoid updates.
salt:
source:
engine: None
Reclass storage with data fetched from git
reclass:
storage:
enabled: true
base_dir: /srv/reclass
source:
engine: git
repo: git+https://github.com/salt-formulas/reclass
branch: master
Reclass storage with local data source
reclass:
storage:
enabled: true
base_dir: /srv/reclass
data_source:
engine: local
Reclass storage with archive data source
reclass:
storage:
enabled: true
base_dir: /srv/reclass
data_source:
engine: archive
address: salt://path/reclass-project.tar
Reclass storage with archive data source with content hash check
reclass:
storage:
enabled: true
base_dir: /srv/reclass
data_source:
engine: archive
address: https://mydomain.tld/bar.tar.gz
hash: sha1=5edb7d584b82ddcbf76e311601f5d4442974aaa5
Reclass model with single node definition
reclass:
storage:
enabled: true
node:
service_node01:
name: svc01
domain: deployment.local
classes:
- cluster.deployment_name.service.role
params:
salt_master_host: <<salt-master-ip>>
linux_system_codename: trusty
single_address: <<node-ip>>
Reclass model with multiple node defined
reclass:
storage:
enabled: true
repeat_replace_symbol: <<count>>
node:
service_node01:
name: node<<count>>
domain: deployment.local
classes:
- cluster.deployment.service.role
repeat:
count: 2
start: 5
digits: 2
params:
single_address:
value: 10.0.0.<<count>>
start: 100
deploy_address:
value: part-<<count>>-whole
start: 5
digits: 3
params:
salt_master_host: <<salt-master-ip>>
linux_system_codename: trusty
Reclass model with multiple node defined and interpolation enabled
reclass:
storage:
enabled: true
repeat_replace_symbol: <<count>>
node:
service_node01:
name: node<<count>>
domain: deployment.local
classes:
- cluster.deployment.service.role
repeat:
count: 2
start: 5
digits: 2
params:
single_address:
value: ceph_osd_node<<count>>_address
start: 1
digits: 2
interpolate: true
params:
salt_master_host: <<salt-master-ip>>
linux_system_codename: trusty
Reclass storage with simple class mappings
reclass:
storage:
enabled: true
class_mappings:
- target: '\*'
class: default
ignore_class_notfound: true
Reclass models with dynamic node classification
reclass:
storage:
enabled: true
class_mapping:
common_node:
expression: all
node_param:
single_address:
value_template: <<node_ip>>
linux_system_codename:
value_template: <<node_os>>
salt_master_host:
value_template: <<node_master_ip>>
infra_config:
expression: <<node_hostname>>__startswith__cfg
cluster_param:
infra_config_address:
value_template: <<node_ip>>
infra_config_deploy_address:
value_template: <<node_ip>>
infra_proxy:
expression: <<node_hostname>>__startswith__prx
node_class:
value_template:
- cluster.<<node_cluster>>.stacklight.proxy
kubernetes_control01:
expression: <<node_hostname>>__equals__ctl01
cluster_param:
kubernetes_control_node01_address:
value_template: <<node_ip>>
kubernetes_control02:
expression: <<node_hostname>>__equals__ctl02
cluster_param:
kubernetes_control_node02_address:
value_template: <<node_ip>>
kubernetes_control03:
expression: <<node_hostname>>__equals__ctl03
cluster_param:
kubernetes_control_node03_address:
value_template: <<node_ip>>
kubernetes_compute:
expression: <<node_hostname>>__startswith__cmp
node_class:
value_template:
- cluster.<<node_cluster>>.kubernetes.compute
Classify node after creation and unclassify on node deletion
salt:
master:
reactor:
reclass/minion/classify:
- salt://reclass/reactor/node_register.sls
reclass/minion/declassify:
- salt://reclass/reactor/node_unregister.sls
Event to trigger the node classification
salt-call event.send 'reclass/minion/classify' "{'node_master_ip': '$config_host', 'node_ip': '${node_ip}', 'node_domain': '$node_domain', 'node_cluster': '$node_cluster', 'node_hostname': '$node_hostname', 'node_os': '$node_os'}"
Note
You can send any parameters in the event payload, all will be checked against dynamic node classification conditions.
Both actions will use the minion ID as the node_name to be updated.
Event to trigger the node declassification
salt-call event.send 'reclass/minion/declassify'
More Information¶
Documentation and Bugs¶
To learn how to install and update salt-formulas, consult the documentation available online at:
In the unfortunate event that bugs are discovered, they should be reported to the appropriate issue tracker. Use Github issue tracker for specific salt formula:
For feature requests, bug reports or blueprints affecting entire ecosystem, use Launchpad salt-formulas project:
You can also join salt-formulas-users team and subscribe to mailing list:
Developers wishing to work on the salt-formulas projects should always base their work on master branch and submit pull request against specific formula.
Any questions or feedback is always welcome so feel free to join our IRC channel:
#salt-formulas @ irc.freenode.net