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.modules
Tout le reste est bâti là-dessus :
les
states
sont mis en œuvre par lemodule
salt appeléstates
(donc par le module Pythonsalt.modules.states
)les
grains
sont mis en œuvre par lemodule
salt 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.modules
ou dans un
module
dé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
module
salt, ouexecution module
est un module Python regroupant des fonctions qui peuvent être exécutées sur un minionUne fonction d’un
module
salt 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
state
vise à mettre le système dans un état particulierUn
state
est une fonction Python définie dans un module Python appeléstate module
, présent :dans le package
salt.states
dans un fichier Python placé par l’utilisateur dans
$SALT_STATES/_states/
Un
state
doit ê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 commandeinstall
dumodule
saltpkg
vue 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
installed
vs.latest
installed
s’assure que le paquet est installé (et éventuellement à la version demandée)
latest
s’assure que la dernière version disponible du paquet est installée
removed
s’assure que le paquet n’est pas installé, et le désinstalle s’il est présent.
purged
identique à
removed
, en supprimant les fichiers de configuration.
pkgrepo
#
Gestion des sources de paquets supplémentaires (apt
, yum
, etc.)
managed
s’assure que le dépôt est présent et configuré sur le système
absent
s’assure que le dépôt n’est pas présent sur le système
file
#
State module
de manipulation de fichiers
absent
s’assure que le fichier n’existe pas
append
s’assure qu’un texte est présent dans un fichier
comment
s’assure qu’une ligne est commentée (regex)
directory
s’assure que le répertoire existe (droits, etc.)
exists
s’assure qu’un fichier existe (mais n’en produit pas le contenu
managed
s’assure qu’un fichier dont le contenu est produit par salt existe et à jour
uncomment
s’assure qu’un ligne de texte est décommentée (regex)
file
: remarques#
attention aux
watch
attention 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.absent
pour supprimer un fichier (après modification des fichiers.sls
par 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_present
s’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
run
exécute une commande (si les circonstances l’exigent)
script
exé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.run
aveconchanges
pour 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-minion
détecte au démarrage s’il a besoin de charger un module donnéPar exemple si la commande
zfs
n’est pas disponible sur l’hôte, il ne chargera pas le modulezfs
En 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 modules
renvoie 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
argspec
revoie la signature d’une fonction
list_functions
liste les fonctions de tous les modules (ou d’un seul si spécifié)
list_modules
liste les modules disponibles
reload_modules
demande au minion de recharger les modules
test
#
Module proposant divers tests exécutés par salt-minion
echo
retourne la chaîne passée en paramètre (test de la connexion)
get_opts
renvoie les options de configuration du minion
not_loaded
liste des modules d’exécution non chargés par le minion
ping
s’assure que le minion répond à une requête du master
version
retourne la version salt du minion
versions_report
retourne les versions des composants utilisés par salt
pkg
#
Module virtuel de gestion des paquets d’une distribution Linux
pkg.
available_version
version d’un paquet candidate pour la mise à jour
file_list
liste des fichiers d’un paquet installé
install
installe un paquet
latest_version
dernière version disponible d’un paquet
list_pkgs
liste des paquets installés
list_repos
liste des sources d’entrepôts
purge
purge un paquet installé ou supprimé
refresh_db
met à jour la base des paquets disponibles
remove
supprime un paquet installé
upgrade
met à jour tous les paquets
upgrade_available
vérifie si un paquet est candidat à une mise à jour
version
version d’un paquet installé
service
#
Module de manipulation des services Linux (démons, init scripts System V et systemd)
available
renvoie
True
si le service est disponibledisable/enable
désactive/active le service
disabled/enabled
renvoie
True
si le service est désactivé/activéforce_reload
recharge le service (forcé)
get_all
liste tous les services disponibles
get_disabled
liste les services désactivés
get_enabled
liste les services activés
reload
recharge un service
restart
redémarre un service
start
démarre un service
status
affiche l’état du service
stop
arrête un service
network
#
Module de gestion des interfaces réseau
arp
retourne la table arp du minion
dig
effectue une requête DNS sur le minion
hw_addr
renvoie les adresses MAC des interfaces réseau
interfaces
retourne un dictionnaire des informations sur les interfaces réseau
ip_addrs
retourne les adresses IPv4
ip_addrs6
retourne les adresses IPv6
netstat
retourne des informations sur les ports ouverts
ping
effectue un ping réseau
subnets
liste des subnets auquel le minion appartient
traceroute
effectue un traceroute
iptables
#
Module de manipulation de iptables
append
ajoute une règle iptable
check
vérifie la présence d’une règle iptable
delete
supprime une règle
flush
supprime toutes les règles
get_policy
retourne la politique d’une table/chaîne
get_rules
retourne les règles iptables
insert
insère une règle
set_policy
configure la politique d’une table/chaîne
version
version de iptables
hg
et git
#
Modules de manipulation d’un entrepôt Mercurial ou git
archive
créee une archive (tgz) à partir d’un entrepôt hg ou git
clone
clone un entrepôt hg
describe
retourne l’identifiant d’une révision
revision
retourne 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
cmd
exécute une commande salt (le minion doit aussi être un master)
find_job
retourne les données associées à un job id
is_running
renvoie
True
si la fonction passée en argument est en cours d’exécution (peut utiliser des glob patterns)kill_job/term_job
interrompt l’exécution d’un job (SIGKILL 9 / SIGTERM 15)
signal_job
envoie un signal à un job
regen_keys
demande au minion de régénérer ses clefs AES
running
retourne des informations sur les processus salt qui tournent sur le minion
sync_all
demande au minion de rafraîchir tous ses modules dynamiques
sync_grains
demande au minion de recharger les modules
_grains
sync_modules
demande au minion de recharger les modules
_modules
sync_outputters
demande au minion de recharger les modules
_outputters
sync_returners
demande au minion de recharger les modules
_returners
sync_states
demande au minion de recharger les modules
_states
refresh_modules
demande au minion de rafraîchir les données des modules et des grains
refresh_pillar
demande 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
) :