Supposons que j'ai un hôte qui est, entre autres, un serveur Web, où le rôle Ansible associé s'installe nginx
, effectue une configuration essentielle dans /etc/nginx
et ouvre les ports 80 et 443 dans le pare-feu.
À un moment donné, je veux que cet hôte particulier ne soit plus un serveur Web, car pour une raison quelconque, j'ai déplacé ce service ailleurs. Le simple fait de retirer le serveur de [webservers]
l'inventaire laisserait des ordures sur le serveur. Idéalement, je voudrais désinstaller nginx
, supprimer le /etc/nginx
répertoire (et certains autres répertoires) et fermer les ports 80 et 443 du pare-feu.
Dans Puppet, je peux le faire. Un hôte qui est un serveur Web aura quelque chose comme ça dans sa configuration:
class { 'nginx':
ensure => present,
}
et tout ce que j'ai à faire est de remplacer "présent" par "absent". Si la nginx
classe est bien écrite, elle annulera les modifications qu'elle a apportées. (En règle générale, un administrateur remplace «présent» par «absent», et plus tard, lorsqu'il est certain que tous les hôtes concernés ont annulé la configuration, il supprime l'élément du manifeste.)
De plus, je pense que le module de pare-feu Puppet supprime automatiquement les règles de pare-feu qui ne peuvent plus être trouvées dans le manifeste; donc je pense que, pour le pare-feu, vous n'avez même pas besoin de faire cette chose "absente" ci-dessus, le pare-feu se fermera automatiquement de toute façon.
Comment puis-je réaliser ces choses avec Ansible?
ensure => present
pourensure => absent
lequel aussi ... Comment faire la même chose avec ansible" etc. Idéalement avec un exemple de tout ce que vous avez déjà essayé.Réponses:
Avec Ansible, vous ne feriez pas vraiment cela différemment de la façon dont vous le feriez avec Puppet.
Dans votre exemple, où vous définiriez
vous comptez sur l'auteur de ce module marionnette ayant écrit le code nécessaire pour tout supprimer. Tous les modules de marionnettes n'ont pas cela.
De même, avec Ansible, vous pouvez avoir des rôles qui ont à la fois les étapes nécessaires pour l'installer et le supprimer. La différence réside uniquement dans la façon d'invoquer les deux.
Une approche pourrait être celle où le rôle en question expose une variable pour basculer le comportement. Par exemple, ce rôle nginx peut prendre une variable
nginx_state
qui prend les valeursinstalled
etabsent
.Dans le rôle
tasks/main.yml
, l'auteur du rôle pourrait avoir quelque chose dans le sens de ....avec la logique d'installation / désinstallation respective divisée entre ces deux fichiers inclus conditionnellement.
Les rôles possibles peuvent également être imbriqués. Comme autre moyen de faire de même, un auteur de rôle peut par exemple fournir un rôle
nginx
avec un autre rôle à l'intérieur, appeléuninstalled
. Vous pourriez alors faire:Ansible, comparé à Puppet, a sans doute moins de règles et de directives sur la façon dont les choses devraient être faites, donc les pratiques varient un peu plus à l'état sauvage, mais les mêmes concepts s'appliquent.
la source
- { role: nginx, state: absent }
) mais cela me semble extrêmement verbeux. Le seul inconvénient du rôle imbriqué que j'ai vu était que j'avais besoin de lier les variables par défaut du parent.roles: -nginx/uninstalled
travailler? J'ai cherché partout, mais je ne trouve aucune documentation sur l'imbrication des rôles d'une manière qui me permettrait de le faire.Puisque vous avez votre configuration / provisioning dans Ansible, vous pouvez simplement souffler tout le serveur, réinstaller / provisionner un nouveau et avoir un bel état connu propre pour le faire fonctionner.
Si vous souhaitez réellement le "reconfigurer" à d'autres fins, vous devez créer un nouveau playbook qui effectue les tâches de nettoyage nécessaires.
Pour autant que je sache, tous les modules de packaging Ansible prennent
state=absent
en charge pour garantir qu'un package donné n'est pas installé sur votre serveur. De plus, leapt
module a unpurge=yes
paramètre qui nettoiera tous les fichiers de configuration personnalisés restants.Vous pouvez également créer des tâches pour confirmer que le port 80 est protégé par un pare-feu. Cependant, comme vous n'aurez aucun processus en cours d'exécution sur ce port, le pare-feu ne fera aucune différence pour la sécurité de votre serveur.
la source
state=absent
ajoutés. Il y a de fortes chances que vous supprimiez ou annuliez une bonne majorité des modifications de configuration que vous avez apportées. Selon la taille du rôle, cela peut être un véritable PITA à tester.