Seit der Einführung der onedir-Instllation mit Salt 3006 sind Funktionen, welche zusätzliche Python Module benötigen sehr instabil. Die Installation zusätzliche Module gelingt oft nicht. Und bei einem Update von Python Modulen oder vom Salt-Master ist man immer dem Risiko ausgesetzt, dass Funktionen plötzlich nicht mehr funktionieren, weil die Abhängigkeiten der Module nicht aufgelöst werden können.
Die Anbindung des Salt-Masters an eine MySQL Datenbank ist so ein Wackelkandidat.
Die Installation des MySQL Python Modules erfordert das Downgrade der Pip Version. Niemand garantiert, dass zukünftige Versionen des Salt-Master mit einer älteren Version von Pip oder dem dann aktuellen MySQL Modul kompatibel sind.
All Salt Funktionen, welche eine Installation eines Moduls mit salt-pip erfordern, sollten Sie mit äußerster Versicht verwenden.
Ab MySQL 5.7 oder MariaDB 10.2 wird der Datentyp JSON unterstützt, welcher für Salt sehr nützlich ist.
Benutzer und Datenbank anlegen
cat << EOF | mysql
CREATE USER IF NOT EXISTS 'salt'@'localhost' IDENTIFIED WITH mysql_native_password BY 'salt';
GRANT ALL ON salt.* TO 'salt'@'localhost';
CREATE DATABASE IF NOT EXISTS salt DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
EOF
Tabellen gemäß Doku per Copy-and-paste anlegen und anschließend den Datentyp JSON verwenden.
cat << EOF | mysql salt
ALTER TABLE salt_returns MODIFY `return` json;
ALTER TABLE salt_returns MODIFY `full_ret` json;
ALTER TABLE jids MODIFY `load` json;
EOF
Oder die folgenden Zeilen per Copy & Paste übernehmen, um die Tabellen anzulegen.
USE `salt`;
--
-- Table structure for table `jids`
--
DROP TABLE IF EXISTS `jids`;
CREATE TABLE `jids` (
`jid` varchar(255) NOT NULL,
`load` json NOT NULL,
UNIQUE KEY `jid` (`jid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE INDEX jid ON jids(jid) USING BTREE;
--
-- Table structure for table `salt_returns`
--
DROP TABLE IF EXISTS `salt_returns`;
CREATE TABLE `salt_returns` (
`fun` varchar(50) NOT NULL,
`jid` varchar(255) NOT NULL,
`return` json NOT NULL,
`id` varchar(255) NOT NULL,
`success` varchar(10) NOT NULL,
`full_ret` json NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
KEY `id` (`id`),
KEY `jid` (`jid`),
KEY `fun` (`fun`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Table structure for table `salt_events`
--
DROP TABLE IF EXISTS `salt_events`;
CREATE TABLE `salt_events` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`tag` varchar(255) NOT NULL,
`data` mediumtext NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`master_id` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `tag` (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Den MySQL-Job-Cache aktivieren
Datei /etc/salt/master.d/mysql.conf anlegen mit folgendem Inhalt
Datei /etc/salt/master.d/jobcache.conf anlegen mit folgendem Inhalt
/etc/salt/master.d/jobcache.conf
master_job_cache: mysql
Den Salt-Master neu starten und dann mal ausprobieren
salt '*' status.loadavg
salt '*' status.diskusage
select alter_time, id,`return`->'$."/".available'
from salt_returns
where fun = 'status.diskusage';
select id,`return`->'$."5-min"' as loadAvg5, alter_time
from salt_returns
where fun = 'status.loadavg';
select id,`full_ret`->'$.fun_args' as state,success,alter_time
from salt_returns
where fun="state.apply";
select id,`return`->'$."/".available' as available
from salt_returns
where fun = 'status.diskusage'
having available>100;
Auslesen eines Job-Resultats, der z. B. mit der state.apply <STATE> --async ausgelöst wurde.
select
id,
success,
alter_time as date,
fun,
`full_ret`->'$."fun_args"' as fun_args
from salt_returns
where jid="<JOB-ID>";