Legen Sie nun einen Benutzer und eine Datenbank an.
cat<<EOF|mysqlCREATE 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
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:2as_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.
Sie können auch mehrere Spalten in ein Pillar-Dict schreiben.
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.
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.
Daten einfügen
Pro Ordner, der ins Backup aufgenommen werden soll, wird eine Zeile eingefügt.
Pillar andocken
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.
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
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
$ salt ruby pillar.items
ruby:
fromdb:
----------
tiere:
- hase
- igel
verein:
1. FC Köln
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
/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
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
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
ext_pillar:
- mysql:
backup_cfg:
query: |
SELECT 'dirs',GROUP_CONCAT(dir)
FROM backup_cfg
WHERE client_id = %s
GROUP BY client_id;
# 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 %}