Intégration satellite et tour Ansible

Vous utilisez Red Hat Satellite et Red Hat Ansible Automation Platform? À partir de Satellite 6.3, ils peuvent être intégrés les uns aux autres afin que Dynamic Inventory dans Ansible Tower extrait les listes d'hôtes du Satellite. De plus, si les hôtes RHEL sont initialisés à l'aide de Satellite (ce qui signifie l'approvisionnement), Ansible Tower peut être intégré à ce processus afin qu'il exécute automatiquement des scripts de configuration sur les nouveaux hôtes.



Dans cet article, nous verrons comment configurer l'inventaire dynamique dans Ansible Tower afin qu'il tire les hôtes du satellite, et nous montrerons comment l'utiliser avec des exemples. De plus, nous vous montrerons comment organiser un appel automatique vers Ansible Tower après avoir initialisé un nouvel hôte depuis Satellite.

1. Inventory. Satellite, Dynamic Inventory Ansible Tower


Pour qu'Ansible Tower ait accès à la liste des hôtes, groupes d'hôtes et autres informations connexes, elle a besoin d'un compte Satellite. Cette entrée a suffisamment d'autorisations minimales, nous allons donc créer un nouveau rôle dans Satellite, lui donner uniquement les autorisations nécessaires pour Ansible Tower, puis créer un nouveau compte et lui affecter ce rôle.

Satellite 6.6 et versions ultérieures ont déjà un rôle Ansible Tower Inventory Reader prêt pour cela, vous pouvez donc ignorer les étapes ci-dessous pour créer un rôle.

Dans le satellite 6.3-6.5, le rôle devra être créé à la main. Pour ce faire, accédez à l'interface Web Satellite, accédez à l'écran Administrer, sélectionnez Rôles et cliquez sur Créer un rôle.

Nous nommons ce rôle ansible_tower_integration_role et définissons des emplacements et des organisations pour cela :



Cliquez sur Soumettre pour créer le rôle. Après cela, cliquez sur son nom et accédez à l'onglet Filtres. Cliquez sur le bouton vert Nouveau filtre et ajoutez les filtres suivants, un par un:

Type de ressource: hôte , autorisation: view_hosts
Type de ressource: groupe d'hôtes , autorisation: view_hostgroups
Type de ressource: valeur de fait , autorisation: view_facts

Par conséquent, les filtres suivants doivent avoir un rôle:



Nous avons donc créé un rôle. Nous allons maintenant créer un nouvel utilisateur dans Satellite, pour lequel nous allons dans le menu Administrer , sélectionnez Utilisateurs et cliquez sur Créer un utilisateur . Nous nommons cet utilisateur ansible_integration , changez le paramètre Authorized by en INTERNAL et définissons le mot de passe. Ensuite, dans les onglets Emplacements et organisations , sélectionnez les emplacements / organisations appropriés. Enfin, allez dans l'onglet Rôles et attribuez à cet utilisateur le rôle ansible_tower_integration_role nouvellement créé (si vous avez Satellite 6.3 - 6.5) ou le rôle intégré Ansible Tower Inventory Reader(Satellite 6.6 et supérieur). Enfin, cliquez sur Soumettre pour créer un compte pour cet utilisateur.

Personnaliser la tour Ansible


Accédez maintenant à l'interface Web d'Ansible Tower et accédez à l'écran des informations d'identification . Cliquez sur le bouton vert + (Ajouter) pour créer une nouvelle entrée d'informations d'identification. Nous l'appelons satellite_integration , et dans le type d'informations d'identification, nous spécifions Red Hat Satellite 6 . Entrez ensuite l'URL (dans notre cas, Satellite 6), ainsi que le nom d'utilisateur (dans notre cas, ansible_integration ), et le mot de passe est celui que nous avons défini dans Satellite ci-dessus:



Cliquez ensuite sur Enregistrer .

Maintenant, allez à l'écran Inventaires , cliquez sur le bouton vert + (Ajouter) et sélectionnez Inventaire . Spécifiez satellite_inventory comme nom et cliquez sur Enregistrer pour créer un inventaire. Après cela, accédez à l'onglet Sources de l'inventaire nouvellement créé et cliquez sur le bouton vert + (Ajouter) . Nous utilisons satellite comme nom de source et spécifions le type de source comme Red Hat Satellite 6 . Dans le champ Credential, spécifiez satellite_integration , qui a été créé à l'étape précédente. Cochez la case Remplacer ,Écraser les variables et mettre à jour au lancement dans le groupe de contrôle Options de mise à jour (vous pouvez en savoir plus sur ces options en utilisant les points d'interrogation à droite). De plus, dans le champ Cache Timeout (Seconds) , entrez 90 et cliquez sur Save .



Maintenant, sans quitter l'onglet Sources , cliquez sur l'icône Démarrer le processus de synchronisation :



Nous attendons que l'icône devienne verte - cela signale la réussite de la synchronisation.

Vous pouvez maintenant accéder à l'onglet Hôtes et voir les données extraites du satellite:



Vous pouvez également consulter l'onglet Groupes:



Comme vous pouvez le voir, la synchronisation a non seulement extrait les listes d'hôtes de Satellite, mais les a également divisées en groupes en fonction des vues de contenu correspondantes dans Satellite, groupes d'hôtes, environnements de cycle de vie, emplacements et organisations. Ce regroupement peut être utilisé pour cibler des scripts Ansible sur des hôtes cibles, et c'est une chose très puissante.

Si vous sélectionnez un hôte dans l'onglet Hôtes, nous verrons qu'entre Satellite et Ansible Tower, beaucoup d'informations auxiliaires sur l'hôte sont synchronisées, qui sont présentées sous forme de variables. Ces variables peuvent ensuite être utilisées dans des scripts Ansible:



Utilisation de l'inventaire dynamique lié au satellite


Nous avons donc synchronisé Satellite et Ansible Tower. Maintenant, nous allons voir comment les utiliser dans la pratique.

Le moyen le plus simple consiste à utiliser satellite_inventory comme source d'inventaire dans le modèle de tour Ansible. Si l'option hosts: all est spécifiée dans le script , le script sera exécuté sur tous les hôtes Satellite.

Une option plus avancée consiste à utiliser des groupes d'inventaire créés automatiquement dans les scripts (comment ils sont créés - voir ci-dessus), en d'autres termes, spécifiez le groupe d'hôtes souhaité dans la ligne d' hôtes . Par exemple, comme dans ce scénario où le package d'écran est installé:

---
- name: Install screen package
  hosts: "foreman_hostgroup_rhel6"
  tasks:
  - yum:
      name: screen
      state: installed

Ici, nous avons enregistré des hôtes: foreman_hostgroup_rhel6 , indiquant ainsi la liste des hôtes formant le groupe d'hôtes rhel6 dans le Satellite. Par conséquent, le script sera exécuté uniquement sur ces hôtes.

De plus, dans le script, vous pouvez spécifier dans la ligne des hôtes les variables que Ansible Tower reçoit lors de la synchronisation avec Satellite. Par exemple, vous pouvez faire ceci:

---
- name: Install screen package
  hosts: "{{ hosts_var }}"
  tasks:
  - yum:
      name: screen
      state: installed

Par conséquent, nous pourrons modifier le modèle de tâche dans Ansible Tower à la volée, en indiquant l'un des groupes d'inventaire via une variable externe.



Dans cet exemple, le modèle ne s'exécutera que sur les hôtes membres du groupe rhel7 dans Satellite.

De plus, le modèle de travail peut être configuré pour qu'au démarrage, il demande à l'utilisateur la valeur de la variable hosts_var (et en même temps affiche les groupes d'inventaire disponibles sous forme de commentaires):



L'écran ci-dessus illustre la situation où, lors du démarrage du modèle, l'utilisateur est invité à entrer le nom du groupe d'inventaire Satellite sur les hôtes duquel vous souhaitez exécuter le script.

De plus, vous pouvez utiliser les variables hôtes extraites de Satellite pendant la synchronisation. Par exemple, voici à quoi ressemble un script montrant comment référencer ces variables:

---
- name: Show Satellite variables
  hosts: all
  tasks:
  - name: Show subscription_status
    debug:
      msg: >
        Subscription Status: {{ foreman.subscription_status_label }}
  - name: Show Errata Counts
    debug:
      msg: >
        Bug fixes: {{ foreman.content_facet_attributes.errata_counts.bugfix }},
        Security: {{ foreman.content_facet_attributes.errata_counts.security }},
        Enhancement: {{ foreman.content_facet_attributes.errata_counts.enhancement }},
        Total: {{ foreman.content_facet_attributes.errata_counts.total }}

Si vous exécutez ce script dans Ansible Tower, il affichera les valeurs des variables:



Et bien sûr, ces variables peuvent être utilisées dans des constructions conditionnelles quand, de sorte que les tâches ne sont lancées que sous certaines conditions. Par exemple, si l'hôte ne dispose pas de correctifs de sécurité ou lorsque l'abonnement à l'hôte n'est pas valide.

Résumer


Red Hat Satellite et Red Hat Ansible sont eux-mêmes des outils très puissants et leur intégration offre une synergie tangible. Ci-dessus, nous avons montré comment faire de Satellite une source de données pour Dynamic Inventory dans Ansible et l'utiliser dans la pratique.

Partie 2. Autoconfiguration de nouveaux hôtes via le rappel de provisioning


Outre de nombreuses autres fonctionnalités, Satellite est également en mesure d'initialiser les hôtes, en d'autres termes, d'effectuer le provisionnement. La tour Ansible, quant à elle, est conçue pour configurer les hôtes. L'intégration vous permet de vous assurer qu'après l'initialisation d'un nouvel hôte RHEL via Satellite, Ansible Tower se connectera automatiquement à cet hôte et exécutera le script de configuration correspondant sur celui-ci. De toute évidence, un tel schéma fait gagner beaucoup de temps aux administrateurs système, les aidant à répondre plus rapidement aux besoins de l'organisation.

Il convient de noter que ce schéma ne fonctionne que si plusieurs conditions sont remplies. Premièrement, Satellite devrait être utilisé comme source de données d'inventaire dynamique dans Ansible Tower (nous avons couvert ce problème dans la partie précédente). Deuxièmement, l'initialisation de l'hôte doit non seulement être effectuée via Satellite, mais également via le mécanisme du groupe d'hôtes (pour plus de détails, voir le Guide de provisioning ).

Ci-dessous, nous montrons comment configurer Satellite et Ansible Tower pour qu'après l'initialisation de l'hôte, il exécute automatiquement le script de configuration Ansible.

Aperçu


Les outils d'automatisation informatique, tels que Ansible Tower, entrent généralement dans l'une des deux catégories suivantes: certains fonctionnent par la méthode push, d'autres par la méthode pull. Dans les systèmes push auxquels Ansible Tower appartient, le serveur d'automatisation établit une connexion avec l'hôte. Dans les systèmes pull, l'initiateur est l'hôte, qui lui-même communique avec le serveur d'automatisation.

Dans notre cas, avec un script automatique sur de nouveaux hôtes, un schéma mixte est utilisé. L'hôte nouvellement initialisé contacte le serveur d'automatisation avec une demande de «rappel» et de configuration. Après cela, le serveur d'automatisation se connecte à cet hôte et exécute le script de configuration demandé par l'hôte sur celui-ci. Par conséquent, dans Ansible Tower, ce mécanisme est appelé rappel de provisioning, qui peut être traduit par «rappel d'initialisation».

Pour montrer pourquoi le rappel de provisioning est nécessaire, considérez la situation suivante: nous avons un certain script de configuration d'hôte qui s'exécute quotidiennement à minuit. Disons qu'à 8 heures du matin, nous initialisons plusieurs nouveaux serveurs à la fois via Satellite. Dans le même temps, Satellite est utilisé comme source de données d'inventaire dynamique dans Ansible Tower, de sorte que les hôtes créés tombent automatiquement dans Ansible. Cependant, le prochain lancement du script d'automatisation n'aura lieu qu'à minuit, c'est-à-dire après 16 heures. Évidemment, c'est loin d'être idéal, et j'aimerais que le script s'exécute immédiatement après l'initialisation du nouvel hôte. Dans ce but, le rappel de provisioning est également pensé.

En général, le rappel de provisioning est configuré et fonctionne comme suit:

  1. Ansible Tower credential root, Satellite . Tower , .
  2. Job Template Ansible Tower provisioning callback. URL Host Config Key, Ansible.
  3. Satellite , provisioning callback Ansible Tower, : URL- Ansible Tower, Host Config Key Ansible.
  4. Satellite /etc/systemd/system/ansible-callback.service ( RHEL 7 8; RHEL 6 ). provisioning callback Ansible Tower, , (URL-, Host Config Key ).
  5. Ansible Tower Host Config Key. , Tower , root, Job Template. , .

Ansible Tower Provisioning Callback


Commençons par créer un script de configuration sur le serveur Ansible Tower qui modifie le contenu de / etc / motd, crée une sorte d'utilisateur et installe un package spécifique. Ensuite, nous utiliserons ce script pour configurer de nouveaux hôtes immédiatement après leur initialisation.

Dans la vie réelle, les scripts d'automatisation sont probablement stockés dans un système de contrôle de version, mais pour simplifier, nous supposons qu'ils se trouvent directement sur le serveur Ansible Tower. Par conséquent, nous entrons dans le serveur Ansible Tower via SSH et créons le répertoire / var / lib / awx / projects / provision pour eux en exécutant la commande suivante:

# mkdir /var/lib/awx/projects/provision

Ensuite, nous créons notre script dans ce répertoire, l'appelons provision.yaml et y écrivons le contenu suivant:

---

- name: Provision new host

  hosts: all

  tasks:

  - name: Set content in /etc/motd 

    copy:

      content: Authorized use only!

      dest: /etc/motd

      mode: 644

      owner: root

      group: root


  - name: Create brian user account

    user:

      name: brian

      uid: 10000

      state: present


  - name: Install tmux package

    yum:

      name: tmux

      state: present


Accédez maintenant à l'interface Web de Tower et accédez à l'écran des informations d'identification. Nous cliquons sur le bouton avec le signe plus vert pour créer un nouvel enregistrement d'informations d'identification, lui donnons le nom provisioning_root et définissons également le type d'informations d'identification comme machine. Dans le champ Nom d'utilisateur, écrivez root et dans le champ Mot de passe, spécifiez le mot de passe spécifié dans Satellite pour une utilisation sur les nouveaux hôtes du groupe d'hôtes correspondant dans Satellite (son nom se trouve dans l'interface Web Satellite sous l'onglet Système d'exploitation). En utilisant cette entrée, Ansible Tower pourra se connecter aux nouveaux hôtes créés lors de l'initialisation via Satellite.



Après cela, dans l'interface Ansible Tower, accédez à l'écran Projets et cliquez sur le signe plus vert pour créer un nouveau projet. Appelez-le provision, changez SCM Type en Manual et spécifiez provision comme répertoire Playbook:



Ensuite, dans l'interface Ansible Tower, accédez à l'écran Modèles, cliquez sur le signe plus vert pour créer un nouveau modèle de travail. Nous l'appellerons provision, dans le champ Inventaire nous écrirons Satellite, dans le champ Projet - provision, dans le champ Playbook - provision.yaml, et dans le champ Credential - provisioning_root. En outre, vous devez activer la case à cocher Autoriser les rappels de provisionnement et cliquer sur l'icône de la baguette magique à droite du champ Clé de configuration de l'hôte pour générer une clé secrète. Cette clé est nécessaire pour demander un rappel de provisionnement. Il ne peut s'agir de personne, mais uniquement de quelqu'un qui connaît la clé de configuration de l'hôte. Sans la bonne clé, le serveur Ansible Tower ne répondra tout simplement pas à la demande.



Maintenant, nous devons nous souvenir pour l'avenir de la valeur de la clé de configuration de l'hôte, ainsi que de l'ID du modèle, qui peut être trouvé à partir de l'URL de ce modèle de travail:

https://tower.example.com/#/templates/job_template/11

Dans cet exemple, l'ID est 11.

Configuration du satellite pour provisionner le rappel


Accédez maintenant à l'interface Web du satellite, accédez à l'écran Configurer et cliquez sur Groupes d'hôtes. Nous sélectionnons le groupe d'hôtes existant, qui est utilisé lors de l'initialisation de nouveaux hôtes, dans notre exemple, c'est RHEL 8.

Sur l'écran d'édition du groupe d'hôtes, allez dans l'onglet Paramètres et créez 4 nouveaux paramètres:

ansible_host_config_key - ici nous entrons la clé de configuration de l'hôte à partir de notre modèle de tour Ansible.
ansible_job_template_id - ici, nous écrivons l'ID du modèle, que nous avons précédemment découvert à partir de l'URL du modèle.
ansible_tower_fqdn est le nom de domaine complet du serveur Ansible Tower.
ansible_tower_provisioning - définie sur true.



Vérifiez comment tout fonctionne


Maintenant, initialisez le nouvel hôte depuis Satellite et vérifiez que le rappel de provisioning fonctionne et exécute automatiquement notre script sur cet hôte.

Dans l'interface Web Satellite, accédez à l'écran Hôtes, cliquez sur Créer un hôte et vérifiez que le groupe pour lequel nous venons de créer 4 nouveaux paramètres est utilisé, c'est-à-dire le groupe RHEL 8.



Une fois l'initialisation de l'hôte terminée, nous devons nous assurer que le modèle qu'il contient a été lancé avec succès. Pour ce faire, accédez à l'écran Modèles de l'interface Web d'Ansible Tower, recherchez notre modèle dans la liste et voyez si le carré le plus à gauche de son indicateur est devenu vert:



Nous cliquons sur cette case verte pour voir les détails du lancement, qui dans notre cas a réussi. Veuillez noter que cette tâche a une limite (Limit) - le lancement de nouveaux hôtes uniquement créés lors de l'initialisation. Eh bien, cela n'est pas surprenant, car le mécanisme de rappel de provisioning exécute uniquement le modèle sur les hôtes qui le demandent.



Passons maintenant à l'hôte nouvellement créé et vérifions s'il correspond à ce qui est écrit dans le script:

[root@provision-test-rhel8 ~]# rpm -qa | grep tmux
tmux-2.7-1.el8.x86_64

[root@provision-test-rhel8 ~]# id brian
uid=10000(brian) gid=10000(brian) groups=10000(brian)

[root@provision-test-rhel8 ~]# cat /etc/motd
Authorized use only!

Dépannage


Si le modèle Ansible Tower ne démarre pas automatiquement sur un nouvel hôte initialisé via Satellite, il y a quelques points à vérifier.

La première étape consiste à savoir si la tour Ansible a reçu une demande de rappel d'approvisionnement, comment le script s'est déroulé et s'il a démarré. Pour ce faire, dans l'interface Tower, accédez à l'écran Modèles et regardez la couleur de l'indicateur à côté du nom du modèle: vert - le lancement a réussi, rouge - le lancement a échoué.



Si la case est rouge, nous cliquons dessus et recherchons des informations supplémentaires pour comprendre pourquoi le lancement a échoué (il peut s'agir à la fois d'erreurs de syntaxe dans le script et d'autres problèmes).

Si le carré est vert, nous cliquons et regardons quand même, car la tâche peut signaler une exécution réussie, mais elle n'a pas réellement démarré sur notre hôte. Par exemple, si la ligne d'hôtes dans le script indique des hôtes et des groupes spécifiques, mais n'inclut pas les hôtes créés lors de l'initialisation, la tâche signalera le succès, mais les informations supplémentaires indiqueront «ignorer: aucun hôte correspondant».

Si le carré indicateur n'est ni vert ni rouge, vous devez commencer par vérifier les paramètres du groupe d'hôtes dans Satellite. Assurez-vous que l'URL du serveur Ansible Tower, la clé de configuration de l'hôte et l'ID du modèle y sont correctement spécifiés.

Ensuite, accédez à l'hôte nouvellement initialisé et vérifiez qu'il existe un fichier /etc/systemd/system/ansible-callback.service (sur les systèmes RHEL 7 ou 8) ou un fichier /root/ansible_provisioning_call.sh (RHEL 6).

Si le fichier n'existe pas, vérifiez que le paramètre ansible_tower_provisioning est défini sur true pour ce groupe d'hôtes et que les modèles d'initialisation sur le serveur Satellite n'ont pas été modifiés.
Si le fichier /etc/systemd/system/ansible-callback.service est présent sur l'hôte, ouvrez-le et recherchez l'URL où la demande de rappel de provisioning est envoyée:

[root@provision-test-rhel8 ~]# cat /etc/systemd/system/ansible-callback.service
[Unit]
Description=Provisioning callback to Ansible Tower
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/curl -k -s --data "host_config_key=aa5ebe82-491c-4fbb-bd36-a6657549451e" https://tower.example.com/api/v2/job_templates/11/callback/
ExecStartPost=/usr/bin/systemctl disable ansible-callback

[Install]
WantedBy=multi-user.target

Vous pouvez exécuter curl et dupliquer manuellement les commandes spécifiées dans ce fichier pour lancer manuellement un rappel de provisioning:

[root@provision-test-rhel8 ~]# /usr/bin/curl -k -s --data "host_config_key=aa5ebe82-491c-4fbb-bd36-a6657549451e" https://tower.example.com/api/v2/job_templates/11/callback/

Si une clé de configuration d'hôte non valide est spécifiée, nous recevrons le message d'erreur suivant:

[root@provision-test-rhel8 ~]# /usr/bin/curl -k -s --data "host_config_key=wrong-key-here" https://tower.example.com/api/v2/job_templates/11/callback/

{"detail":"You do not have permission to perform this action."}

Si l'ID du modèle n'est pas spécifié correctement (ici - 43 au lieu de 11), la réponse sera la suivante:

[root@provision-test-rhel8 ~]# /usr/bin/curl -k -s --data "host_config_key=wrong-key-here" https://tower.example.com/api/v2/job_templates/43/callback/

{"detail":"Not found."}

Vous pouvez également désactiver le mode silencieux (-s) dans la commande curl afin qu'il affiche les erreurs liées à la résolution du nom d'hôte, comme dans l'exemple ci-dessous, où nous avons remplacé le bon nom ansible.example.com par le mauvais ansible-tower.example.com :

[root@provision-test-rhel8 ~]# /usr/bin/curl -k  --data "host_config_key=wrong-key-here" https://ansible-tower.example.com/api/v2/job_templates/11/callback/

curl: (6) Could not resolve host: ansible-tower.example.com

De plus, lors de la recherche de la cause de l'erreur, le fichier /var/log/tower/tower.log sur le serveur Ansible Tower peut s'avérer utile.
Par exemple, ce fichier enregistre l'utilisation d'une clé de configuration d'hôte non valide:

2019-11-19 23:19:17,371 WARNING  awx.api.generics status 403 received by user AnonymousUser attempting to access /api/v2/job_templates/11/callback/ from 192.168.0.138

Cela corrige également l'utilisation d'un ID de modèle non valide:

2019-11-19 23:19:49,093 WARNING  awx.api.generics status 404 received by user AnonymousUser attempting to access /api/v2/job_templates/43/callback/ from 192.168.0.138

2019-11-19 23:19:49,095 WARNING  django.request Not Found: /api/v2/job_templates/43/callback/

Résumer


L'intégration de Satellite et d'Ansible Tower peut grandement optimiser l'initialisation et la configuration de nouveaux hôtes, ce qui fait gagner beaucoup de temps aux administrateurs système, les aidant à répondre plus rapidement aux besoins de l'organisation.

Le 24 mars, de 11h00 à 12h30, Red Hat tiendra un webinaire «Ce que vous devez savoir sur l'automatisation: compétences de base possibles» L'

automatisation est un sujet qui approche en popularité et en nombre de demandes de transformation numérique. Nous vous parlerons de notre vision de l'automatisation - avec Ansible et Ansible Tower - et ce seront les informations de base qui vous ouvriront la porte au nouveau monde courageux des outils d'automatisation déclaratifs.
Après ce webinaire, vous comprendrez les entités de base Ansible, telles que le playbook, l'inventaire, le module. Avec vous, nous maîtriserons la syntaxe YAML de base afin que vous puissiez écrire vos propres scripts. Il envisagera également le lancement de scripts et l'augmentation des privilèges.

En conséquence, vous obtiendrez un ensemble de compétences de base qui vous permettront d'étudier avec succès la documentation et d'autres documents sans le sentiment constant que vous manquez quelque chose. Inscrivez-vous et venez!

All Articles