Using the salt outlet to be used as a status input or SLS rack?

For example, I want to find all nodes with a specific tag, grab their IP address, and then generate a config file to propagate to those nodes.

An example can be a database that needs to know about all other nodes, but can add and remove nodes at any time.

+1


source to share


2 answers


You can use Salt Mine to do this. First, distribute this configuration with all Minions:

mine_functions:
  grains.item:
    - roles
    - fqdn_ip4

      

With this configuration, every Minion will publish these two seeds to all other minions. Read more about Mine here .

Now we can create a file with all names with role = db.



/tmp/mydbhosts:
  file:
    - managed
    - source: salt://example/myhosts
    - template: mako

      

Example template / myhosts:

% for minion, peer_grains in salt['mine.get']('*', 'grains.items').items():
% if "db" in peer_grains["role"]:
minion peer_grains["fqdn_ip4"]
% endif
% endfor

      

+4


source


I have a hacky solution, so hopefully someone else finds a better answer.

The approach is to create a Python script that runs salt

to grab the YAML output network.ip_addrs eth0

, then use it to call specific sls using the column.

I made a rough prototype that still needs to be implemented and configured:

#!/usr/bin/env python
import subprocess
import yaml


# Query all db nodes for their ip addresses
data = subprocess.check_output(
    'salt -G "role:db" network.ip_addrs eth0',
    shell=True
)
data = yaml.load(data)

# Parse and reshuffle for pillar input
addrs = []
for a in data.values():
        addrs.append(a[0])
addrs = yaml.dump({'db_peers': addrs})

# Update configuration file on each node
data = subprocess.check_output(
    'salt -G "role:db" state.sls db.configure pillar="{}"'.format(addrs),
    shell=True
)

      



This will do something along the lines:

salt -G "role:db" state.sls db.configure pillar="db_peers: [1.2.3.4, 2.3.4.5]"

      

This could potentially be put into a module, but I'm not sure how nice it is to ask a salty minion to contact the master to run db.configure

on other nodes. I could just execute a command similar to the script above.

+1


source







All Articles