Datenbanken
Pillars aus einer Datenbank lesen am Beispiel MySQL
MySQL/MariaDB vorbereitend
apt-get install default-mysql-server python3-mysqldbLegen 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';
EOFMaster.conf erweitern
mysql.host: '127.0.0.1'
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
mysql.port: 3306Sollten 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.
ext_pillar:
- mysql:
fromdb:
query: 'SELECT pillar, value FROM pillar WHERE minion_id = %s'
depth: 2
as_list: TrueBegriff 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)
);
EOFPillars 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");
EOFLesen
$ salt ruby pillar.items
ruby:
fromdb:
----------
tiere:
- hase
- igel
verein:
1. FC KölnMehr 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');
EOFWenn 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.
ext_pillar:
- mysql:
dbusers:
query: |
SELECT username,first_name,last_name,sudo,ssh
FROM users
WHERE ssh != %s
depth: 1Listen 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)
);
EOFDaten 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;
EOFPro 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