Comment nettoyer les trucs des rôles qui ne sont plus utilisés sur un serveur?

15

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/nginxet 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/nginxré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 nginxclasse 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?

Antonis Christofides
la source
1
Les questions hypothétiques ne sont pas vraiment sur le sujet ici, je pense, bien que votre question elle-même ne soit pas sans fondement. Au lieu de "faisons semblant ..." reformulons et disons par exemple "Dans la marionnette, je peux changer un rôle serveur et désinstaller nginx qui a été installé précédemment en changeant ensure => present pour ensure => absentlequel aussi ... Comment faire la même chose avec ansible" etc. Idéalement avec un exemple de tout ce que vous avez déjà essayé.
HBruijn
2
Je dirais qu'Ansible n'est pas vraiment conçu pour ce genre de chose. Il est destiné aux serveurs reproductibles et jetables. Si vous ne voulez plus qu'une machine soit un serveur Web, il vous suffit de l'effacer (ou de la terminer s'il s'agit d'une instance de cloud) plutôt que de la réaffecter.
ceejayoz
@ceejayoz le plus que j'ai lu sur Ansibles se trouve dans Ender's Game & sequals d' Orson Scott Card Card, mais ce que vous dites a beaucoup de sens dans l'orchestration cloud
HBruijn
@ceejayoz: Je n'utilise actuellement pas Ansible pour la configuration multi-serveurs, mais pour configurer de petits serveurs autonomes. Je pense que c'est une utilisation valable. Un serveur peut donc avoir nginx + django + PostgreSQL. Si plus tard je décide de mettre nginx ou nginx + django ailleurs, effacer tout le serveur et avoir besoin de ramener PostgreSQL à partir de la sauvegarde semblerait sous-optimal (sans parler du temps d'arrêt).
Antonis Christofides

Réponses:

10

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

class { 'nginx':
  ensure => absent,
}

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_statequi prend les valeurs installedet absent.

Dans le rôle tasks/main.yml, l'auteur du rôle pourrait avoir quelque chose dans le sens de ..

- include: install.yml
  when: nginx_state|default('present') == "present"

- include: uninstall.yml
  when: nginx_state|default('present') == "absent"

..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 nginxavec un autre rôle à l'intérieur, appelé uninstalled. Vous pourriez alors faire:

- name: Uninstall nginx
  hosts: some_group
  roles:
    - nginx/uninstalled

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.

Nick Groenen
la source
1
Bien que techniquement, vous puissiez également passer des arguments directement dans les rôles, je recommanderais d'utiliser le rôle imbriqué. Je trouverais vraiment étrange de voir dans un playbook un rôle, qui sera en fait désinstallé lors de l'exécution du playbook car dans les variables, il est défini comme tel. Le rendre explicite via le rôle imbriqué semble tellement plus propre. Techniquement, il est possible de passer des arguments au rôle ( - { 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.
bogdan.mustiata
Que devez-vous faire pour roles: -nginx/uninstalledtravailler? 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.
aggregate1166877
1

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=absenten charge pour garantir qu'un package donné n'est pas installé sur votre serveur. De plus, le aptmodule a un purge=yesparamè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.

Mxx
la source
Pour ajouter à cela, je parie que la plupart des jeux dans ce rôle auraient pu être state=absentajouté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.
Christopher Karel