Datenbanken

Pillars aus einer Datenbank lesen am Beispiel MySQL

MySQL/MariaDB vorbereitend

apt-get install default-mysql-server python3-mysqldb

Legen Sie nun einen Benutzer und eine Datenbank an.

cat << EOF | mysql
CREATE USER IF NOT EXISTS 'salt'@'localhost' IDENTIFIED WITH mysql_native_password BY 'salt';
CREATE DATABASE IF NOT EXISTS salt;
GRANT ALL ON salt.* TO 'salt'@'localhost';
EOF

Master.conf erweitern

/etc/salt/master.d/mysql.conf
mysql.host: '127.0.0.1'
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
mysql.port: 3306

Sollten Sie bereits eine Datei /etc/salt/master.d/ext_pillar.conf haben, erweitern Sie diese mit dem -mysql Yaml-Block, andernfalls legen Sie die Datei neu an.

/etc/salt/master.d/ext_pillar.conf
ext_pillar:
  - mysql:
      fromdb:
        query: 'SELECT pillar, value FROM pillar WHERE minion_id = %s'
        depth: 2
        as_list: True

Begriff fromdb in Zeile 3 ist ein frei wählbarer Bezeichner. Alle Pillars, die mit der Abfrage aus der Datenbank gelesen werden, werden in ein Dictionary mit der Bezeichnung fromdb gespeichert.

Legen Sie anschließend eine Tabelle an.

cat << EOF | mysql salt
CREATE TABLE pillar (
    pillar_id INTEGER NOT NULL AUTO_INCREMENT,
    minion_id VARCHAR(30) NOT NULL,
    pillar VARCHAR(30) NOT NULL,
    value VARCHAR(30) NOT NULL,
    CONSTRAINT pk_pillar PRIMARY KEY (pillar_id),
    CONSTRAINT uc_minion_id_pillar UNIQUE (minion_id, pillar)
);
EOF

Pillars schreiben und lesen

Schreiben

cat << EOF | mysql salt
REPLACE INTO pillar (minion_id,pillar,value) VALUES ('ruby','verein','1. FC Köln');
REPLACE INTO pillar (minion_id,pillar,value) VALUES ('ruby','tiere',"hase,igel");
EOF

Lesen

$ salt ruby pillar.items
ruby:
    fromdb:
        ----------
        tiere:
            - hase
            - igel
        verein:
            1. FC Köln

Mehr Beispiele in der 📖 Salt-Dokumentation.

Mehrere Spalten

Sie können auch mehrere Spalten in ein Pillar-Dict schreiben.

cat << EOF | mysql salt
CREATE TABLE users (
    pillar_id INTEGER NOT NULL AUTO_INCREMENT,
    username VARCHAR(30) NOT NULL,
    first_name VARCHAR(30) NOT NULL,
    last_name VARCHAR(30) NOT NULL,
    sudo VARCHAR(5) NOT NULL,
    ssh VARCHAR(5),
    CONSTRAINT pk_pillar PRIMARY KEY (pillar_id),
    CONSTRAINT uc_username UNIQUE (username) 
);
EOF

cat << EOF | mysql salt
INSERT INTO users 
    (username,first_name,last_name,sudo,ssh)
    VALUES 
    ('thorsten','Thorsten','Kramm','true','true');
EOF

Wenn die User aus dem Beispiel auf allen Minions verfügbar sein sollen, verwenden Sie eine WHERE-Bedingung, die nie zutrifft. Es ist nicht möglich, die SQL-Abfrage ohne den Platzhalter %s (Minion-ID) anzugeben.

/etc/salt/master.d/ext_pillar.conf
ext_pillar:
  - mysql:
      dbusers:
        query: |
            SELECT username,first_name,last_name,sudo,ssh
            FROM users
            WHERE ssh != %s
        depth: 1

Listen aus der Datenbank lesen

Wenn Sie das Backup-Beispiel so erweitern möchten, dass die Liste der zu sichernden Ordner aus einer Datenbanktabelle gelesen wird, gehen Sie wie folgt vor.

Datenbank anlegen

Die nachfolgende Datenbank besteht aus zwei Spalten, der Minion ID und dem zu sichernden Ordner.

cat << EOF | mysql salt
CREATE TABLE backup_cfg (
    client_id VARCHAR(256) NOT NULL,
    dir VARCHAR(256) NOT NULL,
    CONSTRAINT client_dir UNIQUE (client_id, dir)
);
EOF

Daten einfügen

cat << EOF | mysql salt
INSERT INTO backup_cfg VALUES('susan','/tmp');
INSERT INTO backup_cfg VALUES('susan','/var/lib');
INSERT INTO backup_cfg VALUES('sara','/boot');
SELECT * FROM backup_cfg;
EOF

Pro Ordner, der ins Backup aufgenommen werden soll, wird eine Zeile eingefügt.

Pillar andocken

ext_pillar:
  - mysql:
      backup_cfg:
        query: |
          SELECT 'dirs',GROUP_CONCAT(dir) 
          FROM backup_cfg 
          WHERE client_id = %s 
          GROUP BY client_id;

Sie können keine Arrays oder Dictionaries in MySQL speichern. Sie müssen auf ein Hilfskonstrukt ausweichen, indem Listenelemente durch Kommata getrennt werden. Jinja kann die kommagetrennte Werte in ein Dictionary umwandeln.

# Split a list of string separated by comma
{% dirs = salt['pillar.get']('backup_cfg:dirs',"").split(',') %}
{% for dir in dirs %}
echo {{ dir }}:
  cmd.run: []
{% endfor %}

Last updated