Seit der Einführung der 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.
MySQL Job-Cache auf dem Master installieren
MariaDB oder MySQL Server auf dem Master installieren
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
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>";
Tabellen gemäß per Copy-and-paste anlegen und anschließend den Datentyp JSON verwenden.