States et Modules#
Modules#
Introduction#
SaltStack est un framework d’exécution de commandes à distance
Le cœur du modèle d’exécution de salt est un ensemble de modules Python situés dans le package Python
salt.modulesTout le reste est bâti là-dessus :
les
statessont mis en œuvre par lemodulesalt appeléstates(donc par le module Pythonsalt.modules.states)les
grainssont mis en œuvre par lemodulesalt appelégrains(donc par le module Pythonsalt.modules.grains)etc.
Terminologie#
Quand on parle d’un module salt, on fait référence à un module
d’exécution à distance
Il peut être défini :
dans le package Python
salt.modulesou dans un
moduledéfinit par l’utilisateur et placé dans$SALT_STATES/_modules/
Les autres composants (states, grains, etc.), sont implémentés à
l’aide des modules salt correspondant.
Définition : module#
Un
modulesalt, ouexecution moduleest un module Python regroupant des fonctions qui peuvent être exécutées sur un minionUne fonction d’un
modulesalt exécute une opération sans se soucier de savoir à priori si cette opération est nécessaire ou pasC’est à l’utilisateur de savoir si l’opération doit être effectuée
On peut exécuter une opération
depuis le master
salt machine pkg.install vim
ou depuis le minion
salt-call pkg.install vim
Dans les deux cas présentés ci-dessus, le système va lancer la commande pour installer le paquet vim, même si ce dernier est déjà installé
Définition : state#
Un
statevise à mettre le système dans un état particulierUn
stateest une fonction Python définie dans un module Python appeléstate module, présent :dans le package
salt.statesdans un fichier Python placé par l’utilisateur dans
$SALT_STATES/_states/
Un
statedoit être idempotent, c’est à dire que l’exécuter une ou plusieurs fois doit donner le même résultat.
state : exemple#
L’exécution de la commande :
master# salt machine state.single pkg.installed name=vim
vérifiera si le paquet vim est déjà installé sur le système,
si c’est le cas, il ne fera rien mais terminera son exécution dans l’état
True, sinon, il tentera de l’installer (avec la commandeinstalldumodulesaltpkgvue précédemment) et, en cas de succcès, terminera aussi avecTrue,si l’installation ne se passe pas comme prévu ou si le paquet n’est pas disponible, l’état terminera dans l’état
False
state file : rappels#
Un state file est un fichier .sls qui regroupe des déclarations de
state à appliquer
La forme générale d’un state déclaré dans un state file ressemble à :
deploy-and-config-ssh: # identifiant (unique)
pkg: # nom du state module
- installed # nom de la fonction du state module
- name : openssh-server
file.managed: # concatenation statemodule.function
# suivent arguments passés a la fonction
- source: salt://ssh/authorized_keys
- name: /root/.ssh/authorized_keys # nom du fichier
- template: jinja
service.running:
- name: ssh
- require: # declaration de dependance
- pkg: openssh-server
Appliquer des states#
Soit le fichier vim.sls :
make sure vim is installed:
pkg.installed:
- name: vim
Il est possible de l’appliquer seul :
master# salt 'machine' state.apply vim
Ou de l’inclure dans le top.sls :
base:
'machine':
- vim
Et de l’appliquer en mettant la machine en conformité avec un
apply :
master# salt 'machine' state.apply
Intérêts des states#
Les states sont logiquement utilisés pour définir (partiellement) l’état d’une machine. Cela permet :
d’éviter de réaliser des opérations inutiles (gain de temps),
de différencier les cas où salt réalise une opération de ceux ou salt ne fait rien
identifier les cas où les fichiers ont été modifiés
récupérer les différences
permet l’implémentation d’un mode test (distinguer ce qui doit être fait de ce qui est fait)
Modules et States polymorphes#
Salt propose un mécanisme de définition de module et de state
virtuel permettant l’abstraction du système cible
Ainsi, indépendamment de la distribution utilisée sur la machine cible, une interface unifiée est disponible
Exemple : installer un paquet monpaquet
- pkg.installed: monpaquet
va se traduire, sur un système Debian, en :
root@minion:~# apt-get install monpaquet
ou, pour sur système Fedora, en :
root@minion:~# yum install monpaquet
Attention : de nombreux state modules ont le même nom que
l”execution module sur lequel ils s’appuient ; il ne faut pas les
confondre !
Les principaux state modules#
pkg#
State module de gestion de l’installation de logiciels via un
système de paquets
l’implémentation dépend de la distribution (utilise grains)
attention à la sémantique des 2 fonctions
installedvs.latestinstalleds’assure que le paquet est installé (et éventuellement à la version demandée)
latests’assure que la dernière version disponible du paquet est installée
removeds’assure que le paquet n’est pas installé, et le désinstalle s’il est présent.
purgedidentique à
removed, en supprimant les fichiers de configuration.
pkgrepo#
Gestion des sources de paquets supplémentaires (apt, yum, etc.)
manageds’assure que le dépôt est présent et configuré sur le système
absents’assure que le dépôt n’est pas présent sur le système
file#
State module de manipulation de fichiers
absents’assure que le fichier n’existe pas
appends’assure qu’un texte est présent dans un fichier
comments’assure qu’une ligne est commentée (regex)
directorys’assure que le répertoire existe (droits, etc.)
existss’assure qu’un fichier existe (mais n’en produit pas le contenu
manageds’assure qu’un fichier dont le contenu est produit par salt existe et à jour
uncomments’assure qu’un ligne de texte est décommentée (regex)
file : remarques#
attention aux
watchattention aux droits (conversion en octal si on oublie les quotes et suppression du 0 en premier caractère)
le templating (jinja) pour compléter le contenu du fichier permet de bien exploiter les grains et pillars
attention à la nécessité de
file.absentpour supprimer un fichier (après modification des fichiers.slspar exemple)
file : templating#
Pour activer le templating, utiliser l’argument template
deploy templated file:
file.managed:
- name: /etc/service/conf.d/config.conf
- source: salt://service/templates/mainconf.tmpl
- template: jinja
Il est possible de « passer » des arguments au templating jinja:
deploy templated file:
file.managed:
- name: /etc/service/conf.d/config.conf
- source: salt://service/templates/mainconf.tmpl
- template: jinja
- context:
variable: value
variable2: value2
ini_managed#
Gestion des fichiers ini (sections, clef/valeurs). Pratique avec des dictionnaires génériques.
sections_present:s’assure qu’une section est présente dans le fichier ini
option_presents’assure qu’une option est fixé à une value (section en option)
sections_absent:s’assure qu’une section n’est pas dans le fichier
options_absent:s’assure qu’une clef/valeur n’est pas dans la section et le fichier ini
cmd#
State module de gestion des états résultant de l’exécution d’une
commande arbitraire
runexécute une commande (si les circonstances l’exigent)
scriptexécute un script après l’avoir téléchargé depuis le master
cmd : remarques#
À éviter quand c’est possible :
ne dispose pas des protections d’un state (vérification du résultat, non-exécution si déjà dans l’état recherché)
force à exécuter la commande à chaque fois
utiliser
cmd.runaveconchangespour avoir une exécution conditionelle.
Les principaux execution modules#
Introduction#
Ils sont en général bien documentés
mais ne pas hésiter à aller lire le code
python
Les modules sont chargés en fonction du besoin
salt-miniondétecte au démarrage s’il a besoin de charger un module donnéPar exemple si la commande
zfsn’est pas disponible sur l’hôte, il ne chargera pas le modulezfsEn revanche, si un état modifie le système (eg. installe le paquet
git), les modules sont rechargés.Ceci permet d’utiliser un module alors que l’on vient d’installer ce qui lui permet de fonctionner.
sys#
Avertissement
Le module s’appelle sysmod dans la documentation.
Module de documentation et d’introspection
sys.doc: commande salt de documentation desexecution modulesrenvoie l’ensemble des documentations des modules salt
on peut spécifier en plus un module ou une fonction
root@minion:~# salt-call sys.doc file
master:~$ salt 'machine1' sys.doc file.uncomment
argspecrevoie la signature d’une fonction
list_functionsliste les fonctions de tous les modules (ou d’un seul si spécifié)
list_modulesliste les modules disponibles
reload_modulesdemande au minion de recharger les modules
test#
Module proposant divers tests exécutés par salt-minion
echoretourne la chaîne passée en paramètre (test de la connexion)
get_optsrenvoie les options de configuration du minion
not_loadedliste des modules d’exécution non chargés par le minion
pings’assure que le minion répond à une requête du master
versionretourne la version salt du minion
versions_reportretourne les versions des composants utilisés par salt
pkg#
Module virtuel de gestion des paquets d’une distribution Linux
pkg.
available_versionversion d’un paquet candidate pour la mise à jour
file_listliste des fichiers d’un paquet installé
installinstalle un paquet
latest_versiondernière version disponible d’un paquet
list_pkgsliste des paquets installés
list_reposliste des sources d’entrepôts
purgepurge un paquet installé ou supprimé
refresh_dbmet à jour la base des paquets disponibles
removesupprime un paquet installé
upgrademet à jour tous les paquets
upgrade_availablevérifie si un paquet est candidat à une mise à jour
versionversion d’un paquet installé
service#
Module de manipulation des services Linux (démons, init scripts System V et systemd)
availablerenvoie
Truesi le service est disponibledisable/enabledésactive/active le service
disabled/enabledrenvoie
Truesi le service est désactivé/activéforce_reloadrecharge le service (forcé)
get_allliste tous les services disponibles
get_disabledliste les services désactivés
get_enabledliste les services activés
reloadrecharge un service
restartredémarre un service
startdémarre un service
statusaffiche l’état du service
stoparrête un service
network#
Module de gestion des interfaces réseau
arpretourne la table arp du minion
digeffectue une requête DNS sur le minion
hw_addrrenvoie les adresses MAC des interfaces réseau
interfacesretourne un dictionnaire des informations sur les interfaces réseau
ip_addrsretourne les adresses IPv4
ip_addrs6retourne les adresses IPv6
netstatretourne des informations sur les ports ouverts
pingeffectue un ping réseau
subnetsliste des subnets auquel le minion appartient
tracerouteeffectue un traceroute
iptables#
Module de manipulation de iptables
appendajoute une règle iptable
checkvérifie la présence d’une règle iptable
deletesupprime une règle
flushsupprime toutes les règles
get_policyretourne la politique d’une table/chaîne
get_rulesretourne les règles iptables
insertinsère une règle
set_policyconfigure la politique d’une table/chaîne
versionversion de iptables
hg et git#
Modules de manipulation d’un entrepôt Mercurial ou git
archivecréee une archive (tgz) à partir d’un entrepôt hg ou git
cloneclone un entrepôt hg
describeretourne l’identifiant d’une révision
revisionretourne le hash long d’une révision
ainsi que la plupart des commandes de bases pour chacun de ces 2 DVCS
saltutil#
Module de manipulation d’un salt-minion
cmdexécute une commande salt (le minion doit aussi être un master)
find_jobretourne les données associées à un job id
is_runningrenvoie
Truesi la fonction passée en argument est en cours d’exécution (peut utiliser des glob patterns)kill_job/term_jobinterrompt l’exécution d’un job (SIGKILL 9 / SIGTERM 15)
signal_jobenvoie un signal à un job
regen_keysdemande au minion de régénérer ses clefs AES
runningretourne des informations sur les processus salt qui tournent sur le minion
sync_alldemande au minion de rafraîchir tous ses modules dynamiques
sync_grainsdemande au minion de recharger les modules
_grainssync_modulesdemande au minion de recharger les modules
_modulessync_outputtersdemande au minion de recharger les modules
_outputterssync_returnersdemande au minion de recharger les modules
_returnerssync_statesdemande au minion de recharger les modules
_statesrefresh_modulesdemande au minion de rafraîchir les données des modules et des grains
refresh_pillardemande au minion de rafraîchir les données des pillars
Liste complète des modules#
Retrouvez la liste complète, dans la documentation de référence :
des modules d’exécution (
execution modules) :des modules d’état (
state modules) :