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'

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