├── images ├── adhoc.JPG ├── ans.png ├── image.png ├── navig.png ├── roles.png ├── Capture.JPG ├── ansible.png ├── ansible1.png └── playbook.png ├── 12-cronjob.md ├── 13-Yum-repos&ansible-navigator.md ├── 07-jinja2-et-template.md ├── README.md ├── 05-ansible-vault.md ├── 09-ansible-galaxy.md ├── 04-variables-et-facts.md ├── 01-introduction-ansible-et-setup-environnement.md ├── 08-task-handlers-et-error-handlers.md ├── 10-roles-et-rhel-system-roles.md ├── 03-les-playbooks.md ├── 02-les-commandes-adhocs.md ├── 11-gestion-de-stockage-avec-ansible.md └── 06-conditions-et-loops.md /images/adhoc.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halekammoun/RHCE-Training/HEAD/images/adhoc.JPG -------------------------------------------------------------------------------- /images/ans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halekammoun/RHCE-Training/HEAD/images/ans.png -------------------------------------------------------------------------------- /images/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halekammoun/RHCE-Training/HEAD/images/image.png -------------------------------------------------------------------------------- /images/navig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halekammoun/RHCE-Training/HEAD/images/navig.png -------------------------------------------------------------------------------- /images/roles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halekammoun/RHCE-Training/HEAD/images/roles.png -------------------------------------------------------------------------------- /images/Capture.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halekammoun/RHCE-Training/HEAD/images/Capture.JPG -------------------------------------------------------------------------------- /images/ansible.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halekammoun/RHCE-Training/HEAD/images/ansible.png -------------------------------------------------------------------------------- /images/ansible1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halekammoun/RHCE-Training/HEAD/images/ansible1.png -------------------------------------------------------------------------------- /images/playbook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halekammoun/RHCE-Training/HEAD/images/playbook.png -------------------------------------------------------------------------------- /12-cronjob.md: -------------------------------------------------------------------------------- 1 |

Gestion des Cron Jobs avec Ansible

2 | 3 | ### Introduction 4 | 👋 Dans cette section, nous allons explorer comment gérer des tâches planifiées (cron jobs) en utilisant Ansible. 5 | ### Utilisation du module cron 6 | Ansible fournit le module cron qui permet d'ajouter, de modifier ou de supprimer des tâches planifiées dans le fichier crontab d'un utilisateur. 7 | #### Exemple de création d'un cron job 8 | 9 | Le playbook suivant crée un cron job qui exécute la commande logger "EX294 in progress" toutes les 2 minutes sous l'utilisateur student. 10 | Utilisez le module `ansible.builtin.cron` pour créer le cronjob. 11 | Écrire une tâche Ansible qui crée un cronjob pour un utilisateur nommé student. Ce cronjob doit s'exécuter toutes les 2 minutes et exécuter la commande logger "EX294 in progress" pour ajouter le message "EX294 in progress" dans les logs du système. 12 | ``` bash 13 | vim crontab.yml 14 | ``` 15 | ``` bash 16 | - name: Create a cronjob 17 | hosts: all 18 | tasks: 19 | - name: Cronjob for logger 20 | ansible.builtin.cron: 21 | name: Create logger 22 | user: student 23 | minute: "*/2" 24 | job: logger "EX294 in progress" 25 | state: present 26 | ``` 27 | -------------------------------------------------------------------------------- /13-Yum-repos&ansible-navigator.md: -------------------------------------------------------------------------------- 1 |

Configuration de Yum Repositories et Utilisation d'Ansible Navigator

2 | 3 | ## Introduction 4 | 5 | 👋 Dans cette section, l'objectif est de configurer des Yum Repositories sur plusieurs nœuds en utilisant Ansible, et d'expliquer comment utiliser Ansible Navigator pour gérer et exécuter les playbooks. Nous allons créer deux dépôts Yum : `baseos` et `appstream`, et démontrer comment exécuter des playbooks avec Ansible Navigator. 6 | 7 | 8 | ## Utilisation d'Ansible Navigator 9 | 0. **installer ansible navigator pou tester**: 10 |

11 | cap 12 |

13 | 2. **Installer Ansible Navigator dans l'exam** : 14 | Pour installer Ansible Navigator, utilisez la commande suivante : 15 | ```bash 16 | sudo yum install ansible-navigator 17 | ``` 18 | 19 | 3. **Connecter Podman (si nécessaire)** : 20 | Connectez-vous à votre registre Docker ou Podman si cela est requis pour la configuration: 21 | ```bash 22 | podman login registry.redhat.io 23 | username: ... 24 | password: ... 25 | ``` 26 | 4. **tapez cette commande pour la configuartion auto de navigator** : 27 | ``` bash 28 | ansible-navigator 29 | ``` 30 | 4. **utilisez ansible-navigator pour l'éxecution de playbook** : 31 | ``` bash 32 | ansible-navigator run NomPlaybook.yml -m stdout 33 | ``` 34 | 35 | 36 | ## Configuration des Repositories Yum 37 | 38 | Nous allons créer un playbook Ansible pour configurer deux dépôts Yum : **BaseOS** et **AppStream**. 39 | 40 | ### Création du playbook 41 | 42 | faire un playbook qui crée et configure les deux dépôts Yum sur tous les nœuds définis dans l'inventaire d'Ansible. 43 | Le playbook se compose de deux tâches principales : 44 | 45 | 1. **Créer le dépôt BaseOS** : 46 | - Nom : `baseos` 47 | - Description : `Baseos Description` 48 | - URL : `http://content/rhel9.0/x86_64/dvd/BaseOS` 49 | - GPG : Activé 50 | - Clé GPG : `http://content.example.com/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhatrelease` 51 | - Le dépôt est activé. 52 | 53 | 2. **Créer le dépôt AppStream** : 54 | - Nom : `appstream` 55 | - Description : `App Description` 56 | - URL : `http://content/rhel9.0/x86_64/dvd/AppStream` 57 | - GPG : Activé 58 | - Clé GPG : `http://content.example.com/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhatrelease` 59 | - Le dépôt est activé. 60 | 61 | ```yaml 62 | vim yumrepo.yml 63 | 64 | - name: Creating yum repository 65 | hosts: all 66 | tasks: 67 | - name: Create BaseOS Repository 68 | ansible.builtin.yum_repository: 69 | name: "baseos" 70 | description: "Baseos Description" 71 | baseurl: http://content/rhel9.0/x86_64/dvd/BaseOS 72 | gpgcheck: yes 73 | gpgkey: http://content.example.com/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhatrelease 74 | enabled: yes 75 | 76 | - name: Create Appstream Repository 77 | ansible.builtin.yum_repository: 78 | name: "appstream" 79 | description: "App Description" 80 | baseurl: http://content/rhel9.0/x86_64/dvd/AppStream 81 | gpgcheck: yes 82 | gpgkey: http://content.example.com/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhatrelease 83 | enabled: yes 84 | ``` 85 | -------------------------------------------------------------------------------- /07-jinja2-et-template.md: -------------------------------------------------------------------------------- 1 |

Jinja2 et Template

2 | 3 | ### Introduction 4 | 👋 Dans cette section, nous allons explorer comment utiliser la syntaxe `jinja2` et le module `template`. 5 | 6 | ### Syntaxe Jinja2 et Module template 7 | Jinja2 est un moteur de template utilisé dans Ansible pour générer des fichiers de manière dynamique. Il permet d'incorporer des variables, des boucles et des conditions dans des fichiers de configuration en utilisant des fichiers ayant l'extension `.j2`. 8 | 9 | #### Syntaxe Jinja2 de base : 10 | - `Variables` : Utilisées pour insérer des valeurs dynamiques. 11 | ```bash 12 | {{ variable_name }} 13 | 14 | ``` 15 | - `Boucles` : Utilisées pour répéter une section de code. 16 | 17 | ```bash 18 | {% for item in list %} 19 | {{ item }} 20 | {% endfor %} 21 | 22 | ``` 23 | - `Conditions` : Utilisées pour insérer des sections de code conditionnelles. 24 | 25 | ```bash 26 | {% if condition %} 27 | Some content 28 | {% endif %} 29 | 30 | ``` 31 | #### Module template : 32 | Le module `template` d'Ansible utilise Jinja2 pour créer des fichiers basés sur des templates. Il permet de copier un fichier template vers un emplacement sur l'hôte distant, en remplaçant les variables par leurs valeurs actuelles. 33 | Exemple de module template : 34 | 35 | 36 | ```bash 37 | - name: Render a configuration file from template 38 | template: 39 | src: /path/to/template.j2 40 | dest: /path/to/destination/file 41 | 42 | ``` 43 | ## QUESTION: 44 | 0. create this file called /root/myhosts.j2 in the control node 45 | ```bash 46 | 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 47 | ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 48 | ``` 49 | 1. you should create the jinja template in this file, Then you should create a playbook in /home/ansible called hosts.yml on dev node so that /root/myhosts content will be like below. 50 | The order of the nodes doesn’t matter. 51 | ```bash 52 | 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 53 | ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 54 | 10.0.2.1 node1.example.com node1 55 | 10.0.2.2 node2.example.com node2 56 | 10.0.2.3 node3.example.com node3 57 | 10.0.2.4 node4.example.com node4 58 | 10.0.2.5 node5.example.com node5 59 | ``` 60 | NB: `hostvars` est une variable spéciale dans Ansible qui contient des informations sur tous les hôtes de l'inventaire. C'est un dictionnaire qui vous permet d'accéder aux variables d'un hôte spécifique en utilisant son nom (ou son alias) comme clé. 61 | ## ANSWER: 62 | 63 | 64 | ```bash 65 | vim /home/ansible/myhosts.j2 66 | ``` 67 | 68 | ```bash 69 | 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 70 | ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 71 | {% for host in groups.all %} 72 | {{ hostvars[host].ansible_default_ipv4.address }} {{ hostvars[host].ansible_fqdn }} {{ hostvars[host].ansible_hostname }} 73 | {% endfor %} 74 | 75 | ``` 76 | 77 | ```bash 78 | vim hosts.yml 79 | ``` 80 | 81 | ```bash 82 | --- 83 | - name: Use hosts.j2 template 84 | hosts: all 85 | tasks: 86 | - name: Template a file to dev hosts 87 | template: 88 | src: /home/ansible/hosts.j2 89 | dest: /root/myhosts 90 | when: "'dev' in group_names" 91 | 92 | ``` 93 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Formation RHCE

2 |

3 | Red Hat Logo 4 |

5 |

Automatisation Système avec Ansible sous Red Hat Enterprise Linux

6 | 7 | ## Introduction 8 | 👋 Bienvenue dans ce cours sur l'automatisation système avec Ansible sous Red Hat Enterprise Linux. 9 | Ce cours est conçu pour vous préparer à l'examen RHCE (Red Hat Certified Engineer)! 10 | 11 | 🔧 **Pourquoi ce cours ?** 12 | - **Compétences Pratiques** : Apprenez à utiliser Ansible pour automatiser la gestion de systèmes Red Hat Enterprise Linux. 13 | - **Certification Reconnue** : Obtenez la certification RHCE, reconnue mondialement et très recherchée par les employeurs. 14 | - **Opportunités de Carrière** : Augmentez vos chances de décrocher des postes d'ingénieur DevOps, administrateur système, et bien d'autres. 15 | 16 | 📚 **Ce que vous allez apprendre :** 17 | - **Installation et Configuration d'Ansible** : Déployez et configurez Ansible pour divers environnements. 18 | - **Commandes Ad-Hoc et Playbooks** : Apprenez à utiliser les commandes ad-hoc et à créer des playbooks pour automatiser les tâches. 19 | - **Gestion des Variables et des Facts** : Utilisez les variables, les facts et les variables magiques pour rendre vos playbooks plus dynamiques. 20 | - **Gestion Avancée des Tâches** : Implémentez des conditions, des boucles, des handlers de tâches et des handlers d'erreurs. 21 | - **Utilisation d'Ansible Galaxy et des Rôles** : Téléchargez des rôles à partir d'Ansible Galaxy et créez vos propres rôles pour organiser vos playbooks. 22 | - **Gestion du Stockage avec Ansible** : Configurez et gérez le stockage avec Ansible. 23 | 24 | 🎯 **Objectifs du cours :** 25 | 1. Vous fournir les connaissances et les compétences nécessaires pour réussir l'examen RHCE. 26 | 2. Vous préparer à automatiser efficacement la gestion des systèmes Red Hat Enterprise Linux dans un environnement professionnel. 27 | 3. Développer votre expertise en automatisation système à travers des exercices pratiques et des labs interactifs. 28 | 29 | 🎓 **À qui s'adresse ce cours ?** 30 | - **Administrateurs Système** : Ceux qui souhaitent automatiser leurs tâches et augmenter leur efficacité. 31 | - **Professionnels IT** : Ceux qui cherchent à certifier leurs compétences et à progresser dans leur carrière. 32 | - **Étudiants** : Ceux qui poursuivent des études en informatique et souhaitent acquérir des compétences pratiques en automatisation. 33 | 34 | Rejoignez-nous dans cette aventure et devenez un ingénieur certifié Red Hat ! 🚀 35 | 36 | ## Table des Matières 37 |
    38 |
  1. Introduction à Ansible et Setup de l'Environnement
  2. 39 |
  3. Les Commandes Ad-Hoc
  4. 40 |
  5. Les Playbooks et les Modules
  6. 41 |
  7. Variables, Facts et Variables Magiques
  8. 42 |
  9. Ansible Vault
  10. 43 |
  11. Conditions et Boucles
  12. 44 |
  13. Task Handlers et Error Handlers
  14. 45 |
  15. Ansible Galaxy
  16. 46 |
  17. Rôles et RHEL System Roles
  18. 47 |
  19. Gestion du Stockage avec Ansible
  20. 48 |
49 | -------------------------------------------------------------------------------- /05-ansible-vault.md: -------------------------------------------------------------------------------- 1 |

Ansible-Vault

2 | 3 | ### Introduction 4 | 👋 Dans cette section, nous allons explorer comment utiliser l'outil Ansible-vault. 5 | ### Ansible-vault 6 | `Ansible Vault` est un outil utilisé pour chiffrer des fichiers sensibles, comme des fichiers contenant des mots de passe ou des clés API. Cela permet de sécuriser les informations sensibles dans les playbooks et autres fichiers de configuration. Voici une explication détaillée de l'utilisation d'Ansible Vault et des commandes associées. 7 | ### Commandes Ansible Vault 8 | ```bash 9 | ansible-vault --help 10 | ``` 11 | `ansible-vault create` 12 | créer un nouveau fichier chiffré avec Ansible Vault: 13 | ```bash 14 | ansible-vault create protected_file.yml 15 | ``` 16 | Après avoir exécuté cette commande, vous serez invité à entrer un mot de passe. Ce mot de passe sera utilisé pour chiffrer le fichier. Une fois le fichier créé, vous pouvez le consulter pour vérifier qu'il est bien chiffré. 17 | ```bash 18 | cat protected_file.yml 19 | ``` 20 | `ansible-vault view` 21 | Cette commande permet de visualiser le contenu d'un fichier chiffré sans le modifier. 22 | ```bash 23 | ansible-vault view protected_file.yml 24 | ``` 25 | Vous serez invité à entrer le mot de passe pour déchiffrer et afficher le contenu du fichier. 26 | `ansible-vault edit` 27 | Cette commande permet d'éditer un fichier chiffré. 28 | ```bash 29 | ansible-vault edit protected_file.yml 30 | ``` 31 | Vous serez invité à entrer le mot de passe, puis le fichier s'ouvrira dans votre éditeur de texte par défaut. 32 | `ansible-vault rekey` 33 | Cette commande change le mot de passe d'un fichier chiffré. 34 | ```bash 35 | ansible-vault rekey protected_file.yml 36 | ``` 37 | Vous serez invité à entrer l'ancien mot de passe, puis un nouveau mot de passe. 38 | ### Exécution d'un playbook avec des fichiers chiffrés 39 | Pour exécuter un playbook contenant des fichiers chiffrés, vous pouvez utiliser les options `--ask-vault-password` ou `--vault-password-file`. 40 | #### Option `--ask-vault-password` 41 | Cette option vous invite à entrer le mot de passe pour déchiffrer le fichier. 42 | ```bash 43 | ansible-playbook playbook.yml --ask-vault-password 44 | ``` 45 | #### Option `--vault-password-file` 46 | Cette option utilise un fichier contenant le mot de passe pour déchiffrer le fichier. 47 | ```bash 48 | ansible-playbook playbook.yml --vault-password-file vault_password 49 | ``` 50 | Exemple: 51 | 1. Utilisez Ansible Vault pour créer un fichier de mots de passe chiffré contenant la variable `password` et sa valeur. 52 | 2. Créez un fichier non chiffré contenant la variable `username` et sa valeur. 53 | 3. Écrivez un playbook Ansible qui utilise ces deux fichiers pour créer un utilisateur avec le nom d'utilisateur et le mot de passe spécifiés. 54 | 55 | ```bash 56 | ansible-vault create password.yml 57 | 58 | ``` 59 | 60 | ```bash 61 | password: "Password" 62 | 63 | ``` 64 | ```bash 65 | vim user.yml 66 | ``` 67 | ```bash 68 | username: "alice" 69 | 70 | ``` 71 | ```bash 72 | vim playbook.yml 73 | ``` 74 | 75 | ```bash 76 | - name: Créer un utilisateur avec un mot de passe chiffré 77 | hosts: all 78 | become: true 79 | vars_files: 80 | - user.yml 81 | - password.yml 82 | tasks: 83 | - name: Créer l'utilisateur 84 | user: 85 | name: "{{ username }}" 86 | password: "{{ password | password_hash('sha512') }}" 87 | state: present 88 | 89 | ``` 90 | ```bash 91 | ansible-playbook create_user.yml --ask-vault-password 92 | 93 | ``` 94 | RQ: `{{ password | password_hash('sha512') }}` permet de s'assurer que le mot de passe stocké et utilisé dans le système est sécurisé et haché, plutôt que de stocker et utiliser le mot de passe en clair. 95 | Vérifier avec `/etc/shadow` 96 | -------------------------------------------------------------------------------- /09-ansible-galaxy.md: -------------------------------------------------------------------------------- 1 |

Ansible Galaxy

2 | 3 | ### Introduction 4 | 👋 Dans cette section, nous allons explorer comment utiliser ansible-galaxy et utiliser les rôles préconfigurés. 5 | 6 | 7 | `ansible-galaxy` est un outil en ligne de commande pour gérer les rôles et les collections Ansible. Il permet de télécharger, installer et gérer des rôles depuis des dépôts publics ou privés. 8 | 9 | #### installation de Rôle 10 | ``` bash 11 | ansible-config dump | grep -i galaxy_server 12 | ``` 13 | 14 | Pour installer un rôle depuis Ansible Galaxy, utilisez la commande ansible-galaxy install. 15 | Par exemple, pour installer le rôle geerlingguy.apache, vous pouvez exécuter : 16 | ``` bash 17 | ansible-galaxy install geerlingguy.apache 18 | ``` 19 | NB: 20 | Par défaut, les rôles installés avec ansible-galaxy sont stockés dans le répertoire .ansible/roles. (ansible --version) 21 | #### Changer l'Emplacement par Défaut des Rôles 22 | ``` bash 23 | ansible-config dump | grep -i roles 24 | ``` 25 | 26 | Vous pouvez changer l'emplacement par défaut où ansible-galaxy installe les rôles en utilisant le fichier de configuration `ansible.cfg`. 27 | Ajoutez cette ligne dans le fichier ansible.cfg : 28 | ``` bash 29 | roles_path = /path/to/your/custom/roles 30 | ``` 31 | Dans cet exemple, les rôles seront installés dans /path/to/your/custom/roles au lieu du répertoire roles par défaut. 32 | ``` bash 33 | ansible-config dump | grep -i roles 34 | ``` 35 | #### Appeler un Rôle dans un Playbook 36 | ``` bash 37 | - name: Configure web server 38 | hosts: all 39 | roles: 40 | - geerlingguy.apache 41 | ``` 42 | Dans ce cas, le rôle geerlingguy.apache est utilisé pour configurer un serveur web Apache. 43 | #### Utilisation de requirements.yml pour Installer Plusieurs Rôles 44 | `requirements.yml` est un fichier utilisé pour définir une liste de rôles et de collections à installer via ansible-galaxy. Ce fichier permet de gérer plusieurs rôles de manière centralisée et cohérente. 45 | Exemple de requirements.yml : 46 | 47 | 48 | ``` bash 49 | --- 50 | - name: geerlingguy.apache 51 | src: geerlingguy.apache 52 | 53 | - name: geerlingguy.mysql 54 | src: geerlingguy.mysql 55 | 56 | ``` 57 | #### Installer les Rôles à partir de requirements.yml 58 | 59 | ``` bash 60 | ansible-galaxy install -r requirements.yml 61 | ``` 62 | Cette commande télécharge et installe tous les rôles listés dans le fichier requirements.yml et les place dans le répertoire roles par défaut ou dans le répertoire spécifié dans ansible.cfg. 63 | #### Exemple de Playbook Utilisant Plusieurs Rôles 64 | ``` bash 65 | --- 66 | - name: Configure web and database servers 67 | hosts: all 68 | become: true 69 | roles: 70 | - geerlingguy.apache 71 | - geerlingguy.mysql 72 | ``` 73 | ## QUESTION 74 | 1. Create a file called requirements.yml in /home/ansible/roles to install two roles. The source for the first role is geerlingguy.haproxy and geerlingguy.php. Name the first haproxy-role and the second php-role. The roles should be installed in /home/ansible/roles1. 75 | 76 | ``` bash 77 | echo "roles_path= /home/ansible/roles1" >> ansible.cfg 78 | ``` 79 | ``` bash 80 | vim requirements.yml 81 | ``` 82 | ``` bash 83 | - name: haproxy-role 84 | src: geerlingguy.haproxy 85 | - name: php-role 86 | src: geerlingguy.php 87 | ``` 88 | ``` bash 89 | ansible-galaxy install -r requirements.yml 90 | ``` 91 | 2. Use the roles in a file called role.yml in /home/ansible/. 92 | The haproxy-role should be used on the proxy host and The php-role should be used on the prod host. 93 | ``` bash 94 | 95 | - hosts: proxy 96 | become: true 97 | roles: 98 | - haproxy-role 99 | - hosts: prod 100 | become: true 101 | roles: 102 | - php-role 103 | ``` 104 | -------------------------------------------------------------------------------- /04-variables-et-facts.md: -------------------------------------------------------------------------------- 1 |

Les variables et ansible Facts

2 | 3 | ### Introduction 4 | 👋 Dans cette section, nous allons explorer comment utiliser les variables suivant deux méthodes et comment utiliser les 'Facts'. 5 | 6 | 7 | ### Les variables 8 | #### Utilisation de `vars` 9 | Dans cette méthode, nous définissons les variables directement dans le playbook sous la section `vars` 10 | Exemple 1 : 11 | ```bash 12 | - name: Ajouter utilisateur avec des variables définies 13 | hosts: all 14 | become: true 15 | vars: 16 | username: "alice" 17 | home_directory: "/home/alice" 18 | user_shell: "/bin/bash" 19 | tasks: 20 | - name: Ajouter utilisateur 21 | user: 22 | name: "{{ username }}" 23 | home: "{{ home_directory }}" 24 | shell: "{{ user_shell }}" 25 | state: present 26 | 27 | ``` 28 | #### Utilisation de `vars_files` 29 | Dans cette méthode, nous stockons les variables dans un fichier séparé puis on fait l'appel de fichier dans la section `vars_files` 30 | ```bash 31 | vim variables.yml 32 | ``` 33 | ```bash 34 | username: "alice" 35 | home_directory: "/home/alice" 36 | user_shell: "/bin/bash" 37 | 38 | ``` 39 | 40 | ```bash 41 | vim playbook.yml 42 | ``` 43 | ```bash 44 | - name: Ajouter utilisateur avec un fichier de variables 45 | hosts: all 46 | become: true 47 | vars_files: 48 | - variables.yml 49 | tasks: 50 | - name: Ajouter utilisateur 51 | user: 52 | name: "{{ username }}" 53 | home: "{{ home_directory }}" 54 | shell: "{{ user_shell }}" 55 | state: present 56 | ``` 57 | ### Facts 58 | pour afficher les facts 59 | ```bash 60 | 61 | ansible node1 -m setup | less 62 | ``` 63 | pour filtrer les facts en utilisant les variables 64 | ```bash 65 | 66 | ansible node1 -m setup -a "filter=ansible_default_ipv4" 67 | ``` 68 | Exemple1: de playbook pour affichage de facts. 69 | ```bash 70 | - name: Ansible Facts Playbook 71 | hosts: all 72 | tasks: 73 | - name: Display ansible fact 74 | debug: 75 | var: ansible_hostname 76 | ``` 77 | Exemple2: de playbook pour affichage de facts. 78 | 79 | ```bash 80 | - name: Ansible Facts Playbook 81 | hosts: all 82 | tasks: 83 | - name: Display Facts method1 84 | debug: 85 | var: ansible_default_ipv4.address 86 | - name: Display Facts method2 87 | debug: 88 | var: ansible_facts['default_ipv4']['address'] 89 | ``` 90 | ### QUESTION: 91 | Create a file in /home/ansible called report.yml. Using this playbook, touch a file called report.txt in node1 and node 2 . 92 | The file content of report.txt is 93 | 94 | HOST= inventory hostname 95 | MEMORY=total memory in mb 96 | BIOS=bios version 97 | SDA_DISK_SIZE=disk size 98 | SDB_DISK_SIZE=disk size 99 | Then edit the lines in the file to provide the real information of the hosts. 100 | 101 | ``` bash 102 | - name: QUESTION CORRECTION 103 | hosts: all 104 | become: true 105 | tasks: 106 | - name: get file to nodes 107 | get_url: 108 | url: lien 109 | dest: /home/ansible/report.txt 110 | - name: change hostname 111 | lineinfile: 112 | path: /root/report.txt 113 | line: HOST={{ ansible_hostname }} 114 | regexp: ^HOST 115 | state: present 116 | - name: chahge memory 117 | lineinfile: 118 | path: /root/report.txt 119 | line: MEMORY={{ ansible_memtotal_mb }} 120 | regexp: ^MEMORY 121 | state: present 122 | - name: change bios version 123 | lineinfile: 124 | path: /root/report.txt 125 | line: BIOS={{ ansible_bios_version }} 126 | regexp: ^BIOS 127 | state: present 128 | - name: change sda 129 | lineinfile: 130 | path: /root/report.txt 131 | line: SDA_DISK_SIZE={{ ansible_devices.sda.size }} 132 | regexp: ^SDA_DISK_SIZE 133 | state: present 134 | - name: change sdb 135 | lineinfile: 136 | path: /root/report.txt 137 | line: SDA_DISK_SIZE={{ ansible_devices.sdb.size }} 138 | regexp: ^SDB_DISK_SIZE 139 | state: present 140 | ``` 141 | 142 | -------------------------------------------------------------------------------- /01-introduction-ansible-et-setup-environnement.md: -------------------------------------------------------------------------------- 1 |

Introduction à Ansible et Setup de l'Environnement

2 | 3 | ## Introduction 4 | 👋 Dans cette section, nous allons vous guider à travers les étapes nécessaires pour installer Ansible et configurer votre environnement. 5 | 6 | ## Qu'est-ce qu'Ansible ? 7 | Ansible est un outil d'automatisation qui facilite la gestion des serveurs et des applications. Il est "sans agent", ce qui signifie qu'il n'a pas besoin d'un logiciel spécial installé sur les machines que vous gérez. Il est populaire parce qu'il est simple à utiliser, efficace, et utilise des fichiers YAML faciles à comprendre. 8 |

9 | cap 10 |

11 | 12 | ## Architecture d'Ansible 13 | - `Serveur Ansible` : 14 | C'est l'ordinateur (un laptop, un PC ou un serveur) où Ansible est installé. Il contient : 15 | - `Playbooks` : 16 | Ce sont des fichiers qui définissent ce que vous voulez faire (comme installer des logiciels ou configurer des paramètres). 17 | - `Inventaire` : 18 | Une liste des serveurs que vous gérez, appelée "hôtes",Il sert aussi à organiser ces serveurs en groupes afin de faciliter la gestion et l'exécution des tâches. 19 | - `ansible.cfg` : Contient la configuration par défaut pour Ansible, 20 | 21 | ## Playbooks : 22 | 23 | - `Rôles` : 24 | Groupes de tâches organisées pour une fonction spécifique (par exemple, installer un serveur web). 25 | - `Tâches` : 26 | Ce sont les commandes individuelles que vous voulez exécuter (comme "installer nginx"). 27 | 28 | ## SSH sans mot de passe : 29 | Ansible communique avec les serveurs cibles en utilisant SSH, sans nécessiter de mot de passe à chaque fois. 30 | 31 | ## Comment ça fonctionne ? 32 | - Vous créez des playbooks et un inventaire sur votre machine locale. 33 | - Vous établissez une connexion SSH sans mot de passe aux serveurs cibles. 34 | - Ansible recueille des informations (gather facts) sur les serveurs cibles pour connaître leur état. 35 | - Ansible envoie les instructions (playbooks) aux serveurs. 36 | - Les serveurs exécutent les tâches définies dans les playbooks. 37 | 38 | ## Étapes de Configuration 39 |

40 | cap 41 |

42 | 43 | ### 1. Prérequis 44 | Avant de commencer, assurez-vous d'avoir : 45 | - 3 machines virtuels (1 control node & 2 target nodes) ayant les système Red Hat Enterprise Linux ou CentOS installé. 46 | https://www.mediafire.com/file/vckh650ljsd9vjd/RHEL9.zip/file 47 | - le paquet python3 est installé sur les 3 machines. 48 | ```bash 49 | yum install python3 50 | ``` 51 | 52 | ### 2. Installer Ansible sous le control node. 53 | ```bash 54 | yum install ansible-core 55 | ``` 56 | ### 3. ajouter et configurer le 'remote user' sous les 3 machines. 57 | ```bash 58 | useradd ansible 59 | passwd ansible 60 | ``` 61 | ```bash 62 | vim /etc/sudoers.d/ansible 63 | ansible ALL=(ALL) NOPASSWD: ALL 64 | ``` 65 | 66 | NB: avant de commencer, vous pouvez nommer les machines comme suit. 67 | 68 | ```bash 69 | vim /etc/hosts 70 | son@ip control-node1 71 | son@ip target-node1 72 | son@ip target-node2 73 | 74 | ``` 75 | ### 4. configurer la connexion ssh sans mot de passe depuis le control node en tant que remote user vers les 2 machines. 76 | ```bash 77 | ssh ansible@localhost 78 | ssh-keygen 79 | ls .ssh 80 | ssh-copy-id ansible@target-node1 81 | ssh-copy-id ansible@target-node2 82 | ``` 83 | ### 5. ajouter le fichier inventaire sous le control node 84 | ```bash 85 | [group1] 86 | target-node1 87 | 88 | [group2] 89 | target-node2 90 | ``` 91 | ### 6. ajouter le fichier ansible.cfg sous le control node 92 | ```bash 93 | [defaults] 94 | remote_user=ansible 95 | inventory=/home/ansible/inventory 96 | [privilege_escalation] 97 | become=true 98 | ``` 99 | 100 | ### 7. tester la connexion ssh sans mot de passe en restant en tant que remote user 101 | ```bash 102 | ssh ansible@target-node1 103 | ``` 104 | 105 | ### 5. tester la connexion ansible 106 | ```bash 107 | ansible target-node1 -m ping 108 | ``` 109 | 110 | 111 | -------------------------------------------------------------------------------- /08-task-handlers-et-error-handlers.md: -------------------------------------------------------------------------------- 1 |

Task handlers et Error handlers

2 | 3 | ### Introduction 4 | 👋 Dans cette section, nous allons explorer comment utiliser les variables ignore_errors, ignore_unreachable aussi l'utilisation de block, rescue et always. 5 | 6 | ### ignore_errors et ignore_unreachable dans Ansible 7 | `ignore_errors` est utilisé pour ignorer les erreurs sur une tâche spécifique et continuer l'exécution des tâches suivantes. 8 | ```bash 9 | - hosts: all 10 | tasks: 11 | - name: This task will fail but continue 12 | command: /bin/false 13 | ignore_errors: yes 14 | 15 | - name: This task will still run 16 | command: /bin/echo "Hello, World!" 17 | 18 | ``` 19 | Dans cet exemple, même si la première tâche échoue, Ansible continue et exécute la deuxième tâche. 20 | `ignore_unreachable` est utilisé pour ignorer les hôtes inaccessibles et continuer à exécuter des tâches sur les autres hôtes. Vous l'utilisez généralement au niveau du bloc de lecture ou du bloc de tâches. 21 | 22 | ```bash 23 | - hosts: all 24 | ignore_unreachable: yes 25 | tasks: 26 | - name: This task will run even if some hosts are unreachable 27 | command: /bin/echo "Running on reachable hosts" 28 | 29 | ``` 30 | Dans cet exemple, si certains hôtes sont inaccessibles, Ansible continue à exécuter les tâches sur les hôtes accessibles. 31 | ### Utilisation des blocs (block) 32 | Les blocs (`block`) sont utilisés pour regrouper plusieurs tâches et leur appliquer des directives ou des conditions communes. 33 | Exemple de bloc avec une condition : 34 | ```bash 35 | - hosts: all 36 | tasks: 37 | - block: 38 | - name: Install package 39 | yum: 40 | name: httpd 41 | state: present 42 | 43 | - name: Start service 44 | service: 45 | name: httpd 46 | state: started 47 | when: ansible_os_family == "RedHat" 48 | 49 | ``` 50 | NB: on peut utiliser block pour une condition contenant plusieurs tâches. 51 | ### Utilisation de block et rescue 52 | Les blocs peuvent être utilisés pour gérer les erreurs en utilisant `rescue`, qui définit les tâches à exécuter en cas d'erreur dans le `block`. 53 | 54 | Exemple simple avec block et rescue : 55 | 56 | 57 | ```bash 58 | - hosts: localhost 59 | tasks: 60 | - block: 61 | - name: Run a command that may fail 62 | command: /bin/false 63 | 64 | - name: This task will be skipped if the above fails 65 | command: /bin/echo "This won't run" 66 | rescue: 67 | - name: Handle the error 68 | debug: 69 | msg: "There was an error, handling it now" 70 | 71 | ``` 72 | Dans cet exemple : 73 | 74 | Les tâches à l'intérieur du block sont exécutées en premier. 75 | Si une tâche dans le block échoue, les tâches dans le rescue sont exécutées pour gérer l'erreur. 76 | ### Utilisation de block et always 77 | Les blocs peuvent également être utilisés pour exécuter des tâches finales, indépendamment de la réussite ou de l'échec des tâches précédentes, en utilisant `always`. 78 | 79 | Exemple simple avec block et always : 80 | 81 | 82 | ```bash 83 | - hosts: localhost 84 | tasks: 85 | - block: 86 | - name: Run a command that may fail 87 | command: /bin/false 88 | 89 | - name: This task will be skipped if the above fails 90 | command: /bin/echo "This won't run" 91 | always: 92 | - name: Always run this task 93 | debug: 94 | msg: "This task always runs, regardless of the previous results" 95 | 96 | ``` 97 | Dans cet exemple : 98 | 99 | Les tâches à l'intérieur du `block` sont exécutées en premier. 100 | Les tâches à l'intérieur du `always` sont exécutées quelles que soient les erreurs dans le block. 101 | ### Utilisation de block, rescue et always 102 | Les blocs peuvent également être utilisés pour gérer les erreurs avec `rescue` et pour exécuter des tâches finales avec `always`. 103 | Exemple simple avec rescue et always : 104 | 105 | 106 | ```bash 107 | - hosts: localhost 108 | tasks: 109 | - block: 110 | - name: Run a command that may fail 111 | command: /bin/false 112 | 113 | - name: This task will be skipped if the above fails 114 | command: /bin/echo "This won't run" 115 | rescue: 116 | - name: Handle the error 117 | debug: 118 | msg: "There was an error" 119 | always: 120 | - name: Always run this task 121 | debug: 122 | msg: "This always runs" 123 | 124 | ``` 125 | Dans cet exemple : 126 | 127 | - Les tâches à l'intérieur du block sont exécutées en premier. 128 | - Si une tâche dans le block échoue, les tâches dans le rescue sont exécutées pour gérer l'erreur. 129 | - Les tâches dans le always sont exécutées, que les tâches du block ou du rescue aient échoué ou réussi. 130 | -------------------------------------------------------------------------------- /10-roles-et-rhel-system-roles.md: -------------------------------------------------------------------------------- 1 |

Roles & Rhel-system-roles

2 | 3 | ### Introduction 4 | 👋 Dans cette section, nous allons explorer comment créer un rôle et utiliser quelques rôles de système. 5 | ### Création de rôle Apache 6 | ``` bash 7 | ansible-galaxy --help 8 | ``` 9 | Pour créer un rôle Ansible, vous utilisez la commande ansible-galaxy init. Cela génère une structure de répertoires pour le rôle avec des fichiers de configuration de base. 10 | #### initialiser le rôle 11 | ``` bash 12 | cd /path/to/your/custom/roles 13 | ansible-galaxy init apache 14 | ``` 15 | or you can specify the path 16 | ``` bash 17 | ansible-galaxy init --init-path= /path/to/your/custom/roles apache 18 | ``` 19 | ``` bash 20 | cd apache 21 | tree 22 | ``` 23 | - `handlers/` : Contient des handlers, qui sont des tâches déclenchées par d'autres tâches (par exemple, pour redémarrer un service). 24 | - `tasks/` : Contient les tâches principales du rôle. 25 | - `templates/` : Contient les fichiers de template Jinja2 pour la génération dynamique de fichiers. 26 | - `vars/` : Contient les variables spécifiques au rôle. 27 | #### Définir les Tâches dans tasks/main.yml 28 | ``` bash 29 | 30 | 31 | - name: install packages 32 | yum: 33 | name: "{{item}}" 34 | state: present 35 | loop: "{{packages}}" 36 | 37 | - name: Enable services 38 | service: 39 | name: "{{item}}" 40 | state: started 41 | enabled: yes 42 | loop: "{{packages}}" 43 | - name: Allow webserver service 44 | firewalld: 45 | service: http 46 | state: enabled 47 | permanent: yes 48 | immediate: yes 49 | 50 | - name: Create index file from index.html.j2 51 | template: 52 | src: index.html.j2 53 | dest: /var/www/html/index.html 54 | notify: 55 | - restart_service 56 | ``` 57 | NB: `notify` notifie le handler restart_webservers lorsque le fichier de template change. 58 | #### Créer le Template Jinja2 dans templates/index.html.j2 59 | ``` bash 60 | Welcome to {{ ansible_fqdn }} on {{ ansible_default_ipv4.address }} 61 | ``` 62 | #### Définir le Handler pour Redémarrer le Service 63 | ``` bash 64 | - name: restart_service 65 | service: 66 | name: httpd 67 | state: restarted 68 | ``` 69 | #### Créer variable packages dans vars/main.yml 70 | ``` bash 71 | packages: 72 | - firewalld 73 | - httpd 74 | ``` 75 | 76 | #### Créer un Playbook Utilisant le Rôle 77 | ``` bash 78 | vim apache.yml 79 | ``` 80 | ``` bash 81 | - name: Install apache from apache-role 82 | hosts: all 83 | become: true 84 | roles: 85 | - sample-apache 86 | ``` 87 | ### Rhel-system-roles 88 | `rhel-system-roles` est un ensemble de rôles Ansible fournis par Red Hat pour simplifier la gestion des systèmes RHEL (Red Hat Enterprise Linux). Voici un guide simple pour installer et utiliser ces rôles, et comprendre leur documentation. 89 | #### Installation des Rôles rhel-system-roles 90 | ``` bash 91 | yum install rhel-system-roles 92 | ``` 93 | you can whether 94 | ``` bash 95 | 96 | sudo cp -r /usr/share/ansible/roles/* /home/ansible/roles1 97 | ``` 98 | or add the path directly in the ansible.cfg 99 | ``` bash 100 | [defaults] 101 | remote_user=ansible 102 | inventory=/home/ansible/inventory 103 | roles_path=/home/ansible/roles1:/home/ansible/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles 104 | [privilege_escalation] 105 | become=true 106 | ``` 107 | Cette commande télécharge et installe les rôles dans le répertoire des rôles d'Ansible (souvent ~/.ansible/roles ou un répertoire défini dans votre configuration). 108 | #### Documentation des Rôles 109 | La documentation des rôles rhel-system-roles se trouve généralement dans `/usr/share/doc/rhel-system-roles`. Vous pouvez explorer cette documentation pour obtenir des informations sur les `variables disponibles ` et les `configurations possibles` dans le fichier`README.md`. 110 | ``` bash 111 | ls /usr/share/doc/rhel-system-roles 112 | ``` 113 | #### Rôle timesync 114 | Ce rôle configure le service de synchronisation de l'heure (NTP ou chrony). 115 | Exemple de Playbook utilisant timesync : 116 | ``` bash 117 | cd /usr/share/doc/rhel-system-roles/timesync 118 | ``` 119 | ``` bash 120 | cat example-timesync-playbook 121 | ``` 122 | 123 | ``` bash 124 | - hosts: all 125 | vars: 126 | timesync_ntp_servers: 127 | - hostname: @server 128 | iburst: yes 129 | roles: 130 | - rhel-system-roles.timesync 131 | ``` 132 | #### Rôle selinux 133 | Ce rôle configure les paramètres de SELinux. 134 | Exemple de Playbook utilisant selinux : 135 | ``` bash 136 | cat example-selinux-playbook.yml 137 | ``` 138 | ``` bash 139 | - name: Manage SELinux Booleans 140 | hosts: all 141 | become: yes 142 | vars: 143 | selinux_booleans: 144 | - name: httpd_can_network_connect 145 | state: true 146 | roles: 147 | - rhel-system-roles.selinux 148 | ``` 149 | un autre exemple: 150 | ``` bash 151 | - name: Manage SELinux policy example 152 | hosts: all 153 | vars: 154 | selinux_policy: targeted 155 | selinux_state: enforcing 156 | roles: 157 | - rhel-system-roles.selinux 158 | ``` 159 | -------------------------------------------------------------------------------- /03-les-playbooks.md: -------------------------------------------------------------------------------- 1 |

Les Playbooks

2 | 3 | ### Introduction 4 | 👋 Dans cette section, nous allons explorer comment écrire et exécuter les playbooks. 5 | 6 |

7 | cap 8 |

9 | 10 | - l'extention de playbook peut être .yml ou .yaml. 11 | - Pour vérifier la syntaxe on fait 12 | ``` bash 13 | ansible-playbook --syntax-check 14 | ``` 15 | - Pour exécuter le playbook on fait 16 | ``` bash 17 | ansible-playbook playbook.yml 18 | ``` 19 | 20 | 21 | ## Syntaxe 22 | ```bash 23 | - name: Description du playbook 24 | hosts: [hôtes] 25 | become: [true/false] 26 | tasks: 27 | - name: Description de la tâche 1 28 | [module]: 29 | [arguments] 30 | - name: Description de la tâche 2 31 | [module]: 32 | [arguments] 33 | ``` 34 | 35 | 36 | ### LAB 02 37 | #### Q0. Utilisez un playbook Ansible pour ajouter un utilisateur nommé « alice » avec un shell /sbin/nologin et un home directory /host/alice sur toutes les machines hôtes, aussi pour modifier l'utilisateur « bob » afin que son shell soit /bin/bsh, son UID soit 2006, et son home directory soit /home/bob. 38 | 39 | ``` bash 40 | - name: ajouter alice te modifier bob 41 | hosts: all 42 | become: true 43 | tasks: 44 | - name: ajouter alice 45 | user: 46 | name: alice 47 | home: /home/alice 48 | shell: /bin/bash 49 | state: present 50 | - name: modifier bob 51 | user: 52 | name: bob 53 | uid: 2006 54 | home: /home/bob 55 | shell: /bin/sh 56 | state: present 57 | 58 | ``` 59 | 60 | #### Q1. Utilisez un playbook Ansible pour supprimer l'utilisateur « charlie » de toutes les machines hôtes. 61 | 62 | ``` bash 63 | 64 | - name: supprimer charlie 65 | hosts: all 66 | become: true 67 | tasks: 68 | - name: delete 69 | user: 70 | name: charlie 71 | state: absent 72 | ``` 73 | 74 | #### Q2. Utilisez un playbook Ansible pour installer le package httpd sur la machine hôte web-server, vérifier l'installation du package httpd sur toutes les machines hôtes en utilisant le module command et démarrer et activer ce service sur la machine hôte target-node1. 75 | 76 | 77 | ``` bash 78 | - hosts: web-server 79 | become: true 80 | tasks: 81 | - name: istaller httpd 82 | yum: 83 | name: httpd 84 | state: present 85 | - hosts: all 86 | become: true 87 | tasks: 88 | - name: verif httpd 89 | command: rpm -q httpd 90 | - hosts: target-node1 91 | become: true 92 | tasks: 93 | - name: enable and start httpd 94 | service: 95 | name: httpd 96 | enabled: yes 97 | state: started 98 | 99 | 100 | ``` 101 | 102 | #### Q3. Utilisez un playbook Ansible pour ajouter une ligne au fichier /etc/hosts sur toutes les machines hôtes. La ligne à ajouter est '10.0.0.1 myserver'. 103 | 104 | 105 | ``` bash 106 | hosts: all 107 | become: true 108 | tasks: 109 | - name: modifier ligne 110 | lineinfile: 111 | path: /etc/hosts 112 | line: 10.0.0.1 myserver 113 | ``` 114 | 115 | #### Q4. Utilisez un playbook Ansible pour copier un fichier nommé config.json depuis la machine de contrôle vers le répertoire /etc/myapp/ sur la machine app-server. 116 | 117 | 118 | ``` bash 119 | - hosts: all 120 | become: true 121 | tasks: 122 | - name: créer répertoire /etc/myapp 123 | file: 124 | path: /etc/myapp 125 | state: directory 126 | - name: copier fichier 127 | copy: 128 | src: config.json 129 | dest: /etc/myapp 130 | ``` 131 | 132 | #### Q5. Utilisez un playbook Ansible pour créer un répertoire nommé /backup sur toutes les machines hôtes avec les permissions 0755, appartenant à l'utilisateur root et au groupe root. 133 | 134 | 135 | ``` bash 136 | - hosts: all 137 | become: true 138 | tasks: 139 | - name: création répertoire 140 | file: 141 | path: /backup 142 | state: directory 143 | mode: 755 144 | owner: root 145 | group: root 146 | ``` 147 | ### playbook avec plusieurs plays 148 | Un playbook Ansible peut contenir plusieurs "plays". Chaque "play" applique un ensemble de tâches à un groupe d'hôtes. Cela permet de structurer le playbook pour réaliser différentes phases d'une configuration ou d'un déploiement. 149 | Exemple 1: 150 | - play1: ajouter un utilisateur 151 | - play2: le modifier 152 | NB: on utilise plusieurs plays pour qu'on puisse exécuter les plays dans différentes hotes `hosts` 153 | ```bash 154 | - name: play1 to add group and its user 155 | hosts: all 156 | become: true 157 | tasks: 158 | - name: add the group 159 | group: 160 | name: group1 161 | gid: 4900 162 | - name: add the user 163 | user: 164 | name: user1 165 | uid: 4008 166 | group: group1 167 | - name: play2 to modify the user1 168 | hosts: all 169 | become: true 170 | tasks: 171 | - name: modify 172 | user: 173 | name: user1 174 | uid: 4007 175 | ``` 176 | Exemple 2: 177 | 1. Premier play : Créer un site web. 178 | - installation firewalld et httpd 179 | - 'enable' les services httpd et firewalld 180 | - création index.html 181 | - 'allow' service httpd dans le firewall 182 | 2. Deuxième play : Tester le site web. 183 | - afficher la page web 184 | RQ: Pour installer le module firewalld on doit installer la collection ansible.posix 185 | ```bash 186 | ansible-galaxy collection install ansible.posix 187 | ``` 188 |

189 | Lire service httpd de cours RHCSA 190 |

191 | 192 | ```bash 193 | - hosts: all 194 | become: true 195 | tasks: 196 | - name: install packages 197 | yum: 198 | name: 199 | - firewalld 200 | - httpd 201 | state: present 202 | - name: enable httpd service 203 | service: 204 | name: httpd 205 | state: started 206 | enabled: yes 207 | - name: enable firewalld service 208 | service: 209 | name: firewalld 210 | state: started 211 | enabled: yes 212 | - name: create index 213 | copy: 214 | content: "hello" 215 | dest: /var/www/html/index.html 216 | setype: httpd_sys_content_t 217 | - name: allow httpd service 218 | firewalld: 219 | service: http 220 | permanent: yes 221 | state: enabled 222 | immediate: yes 223 | - hosts: all 224 | become: false 225 | tasks: 226 | - name: webpage test 227 | uri: 228 | url: http://node1 229 | 230 | ``` 231 | -------------------------------------------------------------------------------- /02-les-commandes-adhocs.md: -------------------------------------------------------------------------------- 1 |

Les commandes AD-HOC à Ansible

2 | 3 | ### Introduction 4 | 👋 Dans cette section, nous allons explorer comment utiliser la commande AD-HOC ansible. 5 | ## Syntaxe 6 | `ansible -m -a -i [options]` 7 | - `` : Les hôtes sur lesquels la commande doit être exécutée. Cela peut être all ou un groupe d'hôtes défini dans votre fichier d'inventaire ou une adresse IP/un nom d'hôte spécifique. 8 | 9 | - `-m ` : Le module Ansible à utiliser pour exécuter la tâche. Par exemple, le module ping, shell, command, copy, etc. 10 | NB: Pour lister tous les modules 11 | ``` bash 12 | ansible-doc -l 13 | ``` 14 | NB: Pour obtenir la documentation du module on fait 15 | ``` bash 16 | ansible-doc module_name 17 | ``` 18 | ansible-doc -l | grep user 19 | 20 | - `-a ` : Les arguments à passer au module spécifié. La manière dont les arguments sont spécifiés dépend du module utilisé. 21 | 22 | - `-i ` : Le fichier d'inventaire qui contient la liste des hôtes et leurs groupes. Si vous n'utilisez pas cette option, Ansible utilisera le fichier d'inventaire par défaut situé dans /etc/ansible/hosts. 23 | 24 | [options] : D'autres options supplémentaires peuvent être spécifiées, comme -u pour définir l'utilisateur SSH à utiliser, -b pour élever les privilèges (sudo), etc. 25 | 26 |

27 | cap 28 |

29 | 30 | ### LAB 00 31 | 1. Module `ping` 32 | Ce module est utilisé pour tester la connexion entre Ansible et les hôtes cibles. 33 | ``` bash 34 | ansible all -m ping 35 | ``` 36 | 2. Module `command` 37 | Ce module exécute des commandes sur les hôtes cibles. Contrairement au module shell, il n'interprète pas les caractères spéciaux comme les redirections (>, |, etc.). 38 | ``` bash 39 | ansible all -m command -a "ls -l /etc" 40 | ``` 41 | 3. Module `shell` 42 | Ce module exécute des commandes dans le shell de l'hôte cible, permettant l'utilisation de caractères spéciaux et de redirections 43 | ``` bash 44 | ansible all -m shell -a "echo $HOME > homes_directory" 45 | ``` 46 | 4. Module `copy` 47 | Ce module copie des fichiers de la machine de contrôle Ansible vers les hôtes cibles. 48 | ``` bash 49 | ansible all -m copy -a "src=/path/to/local/file dest=/path/to/remote/destination" 50 | ``` 51 | 5. Module `file` 52 | Ce module gère les fichiers et répertoires sur les hôtes cibles, permettant la création, la suppression et la modification des permissions. 53 | exemple: ajouter un répertoire. 54 | ``` bash 55 | ansible all -m file -a "path=/path/to/directory state=directory" 56 | ``` 57 | 6. Module `lineinfile` 58 | ajouter, supprimer ou modifier des lignes sans affecter le reste du contenu. 59 | exemple: ajouter une ligne. 60 | ``` bash 61 | ansible all -i inventory -m lineinfile -a "path=/etc/fstab line='/dev/sdb1 /mnt/data ext4 defaults 0 0'" 62 | ``` 63 | 7. Module `yum` 64 | Ce module gère les packages sur les systèmes basés sur Red Hat (utilisant yum). 65 | exemple: installer un package 66 | ``` bash 67 | ansible all -m yum -a "name=httpd state=present" 68 | ``` 69 | 8. Module `service` 70 | Ce module gère les services sur les hôtes cibles. 71 | example: restart le service 72 | ``` bash 73 | ansible all -m service -a "name=httpd state=restarted" 74 | ``` 75 | 9. Module `group` 76 | Le module group permet de gérer les groupes sur les hôtes cibles. 77 | exemple: ajouter un groupe 78 | ``` bash 79 | ansible all -m group -a "name=developers gid=2002 state=present" 80 | ``` 81 | 10. Module `user` 82 | exemple: ajouter un utilisateur 83 | ``` bash 84 | ansible all -m user -a "name=developer uid=2001 state=present" 85 | ``` 86 | ### LAB 01 87 | 88 | #### Q0. Exécutez une commande ad hoc pour ajouter un utilisateur nommé « lisa » puis observez la sortie de la commande en utilisant la commande ad-hoc 89 | 90 | 91 | ```bash 92 | ansible all -m user -a "name=lisa" 93 | ansible all -m command -a "tail -1 /etc/passwd" 94 | ``` 95 | 96 | 97 | #### Q1. Modifiez l'utilisateur « lisa » pour que son shell soit /sbin/nologin, que son UID soit 2005 et que son home directory soit /home/lisa. 98 | 99 | 100 | ```bash 101 | ansible all -m user -a "name=lisa shell=/sbin/nologin uid=2005 home=/home/lisa" 102 | 103 | ``` 104 | 105 | #### Q2. Supprimez maintenant l’utilisateur lisa de toutes les machines hôtes 106 | 107 | 108 | ```bash 109 | ansible all -m user -a "name=lisa state=absent" 110 | 111 | ``` 112 | 113 | #### Q3. Installez le package httpd dans la machine hôte target-node1. 114 | 115 | 116 | ```bash 117 | ansible target-node1 -m yum -a "name=httpd state=present" 118 | 119 | ``` 120 | 121 | #### Q4. Vérifiez l’installation du package httpd dans toutes les machines en utilisant le module command 122 | 123 | 124 | ```bash 125 | ansible all -m command -a "rpm -q httpd" 126 | 127 | ``` 128 | 129 | #### Q5. Démarrez et activez maintenant le service httpd dans la machine hôte 130 | 131 | 132 | ```bash 133 | ansible target-node1 -m service -a "name=httpd state=started enabled=yes" 134 | 135 | ``` 136 | 137 | #### Q6. Utilisez le module service pour vérifier l’état de httpd sur tous les machines 138 | 139 | 140 | ```bash 141 | ansible all -m service -a "name=httpd state=started" 142 | ``` 143 | 144 | 145 | #### Q7. Utilisez le module lineinfile pour ajouter une ligne au fichier /etc/hosts sur toutes les machines hôtes. La ligne à ajouter est 192.168.1.100 newhost. 146 | 147 | 148 | 149 | ```bash 150 | ansible all -m lineinfile -a "path=/etc/hosts line='192.168.1.100 newhost' state=present" 151 | 152 | 153 | ``` 154 | 155 | #### Q8. Utilisez le module copy pour copier un fichier nommé index.html depuis la machine de contrôle vers le répertoire /var/www/html/ sur la machine target-node2. 156 | 157 | 158 | ```bash 159 | ansible target-node2 -m copy -a "src=/index.html dest=/var/www/html/" 160 | 161 | 162 | ``` 163 | 164 | 165 | 166 | #### Q10. Utilisez le module file pour créer un répertoire nommé /backup sur toutes les machines hôtes avec les permissions 0755, appartenant à l'utilisateur root et au groupe root. 167 | 168 | 169 | ```bash 170 | ansible all -m file -a "path=/backup state=directory mode=0755 owner=root group=root" 171 | 172 | 173 | ``` 174 | 175 | 176 | #### Q11. Ajoutez une ligne pour configurer le serveur SSH afin d'autoriser l'authentification par mot de passe dans le fichier /etc/ssh/sshd_config. 177 | 178 | 179 | 180 | ```bash 181 | ansible all -m lineinfile -a "path=/etc/ssh/sshd_config line='PasswordAuthentication yes' state=present" 182 | 183 | ``` 184 | 185 | 186 | #### Q12. Supprimez la ligne contenant l'adresse 192.168.1.100 dans /etc/hosts. 187 | 188 | 189 | 190 | ```bash 191 | ansible all -m lineinfile -a "path=/etc/hosts regexp='^192.168.1.100' state=absent" 192 | 193 | ``` 194 | 195 | 196 | 197 | 198 | 199 | -------------------------------------------------------------------------------- /11-gestion-de-stockage-avec-ansible.md: -------------------------------------------------------------------------------- 1 |

Gestion de stockage

2 | 3 | ### Introduction 4 | 👋 Dans cette section, nous allons explorer comment gérer les partitions et les volumes logiques. 5 | 6 | ### Création de partition 7 | On a besoin de la collection community.general pour les modules lvm 8 | ``` bash 9 | ansible-galaxy collection install community.general 10 | ``` 11 | 12 | Pour créer une partition, nous utilisons le module `parted`. 13 | ``` bash 14 | ansible-doc parted 15 | ``` 16 | 17 | ``` bash 18 | --- 19 | - name: Create a new partition 20 | hosts: all 21 | become: yes 22 | tasks: 23 | - name: Create partition 24 | parted: 25 | device: /dev/sda 26 | number: 1 27 | state: present 28 | part_end: 1GiB 29 | 30 | ``` 31 | ### Créer plus qu'une partition 32 | créer 2 partitions chacune a la taille 2G 33 | ``` bash 34 | 35 | - hosts: all 36 | become: true 37 | tasks: 38 | - name: Create a new primary partition with a size of 1g 39 | parted: 40 | device: /dev/sdb 41 | number: 1 42 | #part_start: 1MiB 43 | state: present 44 | part_end: 2GiB 45 | - name: Create a new primary partition with a size of 1g 46 | parted: 47 | device: /dev/sdb 48 | number: 2 49 | part_start: 2GiB 50 | state: present 51 | part_end: 4GiB 52 | ``` 53 | ### Formater la Partition 54 | Ensuite, nous formatons cette partition nouvellement créée en ext4 en utilisant le module `filesystem`. 55 | ``` bash 56 | ansible-doc filesystem 57 | ``` 58 | ``` bash 59 | --- 60 | - name: Format the new partition 61 | hosts: all 62 | become: yes 63 | tasks: 64 | - name: Format partition to ext4 65 | filesystem: 66 | fstype: ext4 67 | dev: /dev/sda1 68 | 69 | ``` 70 | ### Monter la Partition et l'Ajouter à fstab 71 | ``` bash 72 | ansible-doc mount 73 | ``` 74 | ``` bash 75 | - name: Mount the new partition 76 | hosts: all 77 | become: yes 78 | tasks: 79 | - name: Create mount point directory 80 | file: 81 | path: /mnt/data 82 | state: directory 83 | 84 | - name: Mount partition 85 | mount: 86 | path: /mnt/data 87 | src: /dev/sda1 88 | fstype: ext4 89 | state: mounted 90 | 91 | ``` 92 | ## QUESTION 93 | 94 | Create /home/ansible/partition.yml, which will create partitions on all the managed nodes: 95 | a) After sdb creating a 1200M primary partition, partition number 1, and format it into ext4 filesystem and mount it under /srv 96 | c) If there is not enough disk space, give prompt information "Could not create partition of that size" and create a 800M partition. 97 | d) If sdb does not exist, a prompt message will be given "this disk does not exist." 98 | e) format the partition with the ext4 filesystem if it is created 99 | 100 | ``` bash 101 | - name: Partition Playbook 102 | hosts: all 103 | tasks: 104 | - name: check block stroage availablity. 105 | block: 106 | - name: If sdb does not exist 107 | debug: 108 | msg: "this disk does not exist." 109 | when: "'sdb' not in ansible_devices" 110 | - name: Creating the 1200m partition 111 | parted: 112 | device: /dev/sdb 113 | number: 1 114 | part_end: 1200MiB 115 | state: present 116 | when: "'sdb' in ansible_devices" 117 | rescue: 118 | - name: If there is not enough disk space 119 | debug: 120 | msg: "Could not create partition of that size" 121 | - name: Creating the smaller partition 122 | parted: 123 | device: /dev/sdb 124 | number: 1 125 | part_end: 800MiB 126 | state: present 127 | always: 128 | - name: Creating the ext4 filesystem 129 | filesystem: 130 | fstype: ext4 131 | dev: /dev/sdb1 132 | when: "'sdb' in ansible _devices" 133 | - name: Create mount point directory 134 | file: 135 | path: /srv 136 | state: directory 137 | when: "'sdb' in ansible_devices" 138 | - name: Mount partition 139 | mount: 140 | path: /srv 141 | src: /dev/sdb1 142 | fstype: ext4 143 | state: mounted 144 | when: "'sdb' in ansible_devices" 145 | ``` 146 | 147 | ### Création d'un Groupe de Volumes avec lvg 148 | ``` bash 149 | ansible-doc lvg 150 | ``` 151 | ``` bash 152 | --- 153 | - name: Create a Volume Group 154 | hosts: all 155 | become: yes 156 | tasks: 157 | - name: Create volume group 158 | lvg: 159 | vg: vg_data # Nom du groupe de volumes 160 | pvs: /dev/sdb1 # La partition physique à inclure dans le groupe de volumes 161 | 162 | ``` 163 | ### Créer un Volume Logique avec lvol 164 | ``` bash 165 | ansible-doc lvol 166 | ``` 167 | ``` bash 168 | --- 169 | - name: Create a Logical Volume 170 | hosts: all 171 | become: yes 172 | tasks: 173 | - name: Create logical volume 174 | lvol: 175 | vg: vg_data # Le groupe de volumes auquel appartient le LV 176 | lv: lv_data # Nom du volume logique 177 | size: 500m # Taille du volume logique 178 | 179 | ``` 180 | ### Formater le Volume Logique avec filesystem 181 | ``` bash 182 | ansible-doc filesystem 183 | ``` 184 | ``` bash 185 | --- 186 | - name: Format the Logical Volume 187 | hosts: all 188 | become: yes 189 | tasks: 190 | - name: Format logical volume 191 | filesystem: 192 | fstype: ext4 # Type de système de fichiers (ex: ext4, xfs) 193 | dev: /dev/vg_data/lv_data # Dispositif à formater 194 | ``` 195 | ### Monter le Volume en Utilisant le Module mount 196 | ``` bash 197 | ansible-doc mount 198 | ``` 199 | ``` bash 200 | --- 201 | - name: Mount the Logical Volume 202 | hosts: all 203 | become: yes 204 | tasks: 205 | - name: Create mount point directory 206 | file: 207 | path: /mnt/data1 # Chemin du point de montage 208 | state: directory # État souhaité (directory pour créer un répertoire) 209 | - name: Mount logical volume 210 | mount: 211 | path: /mnt/data1 # Chemin du point de montage 212 | src: /dev/vg_data/lv_data # Source du dispositif à monter 213 | fstype: ext4 # Type de système de fichiers 214 | state: mounted # État souhaité (mounted pour monter le volume) 215 | ``` 216 | ## QUESTION 217 | Create a playbook called /home/ansible/lvm.yml that runs on all the managed nodes and does the following: 218 | a) Creates a logical volume with the following requirements: 219 | i.The logical volume is created in the volume group. 220 | ii.The logical volume name is data. 221 | ili.The logical volume size is 1200 Mib. 222 | iv. Format the logical volume with the ext4 file-system. 223 | v. if the requested logical volume size cannot be created, the error message "could not create logical volume of that size" should be displayed and size 800 MiB should be used instead. 224 | vi. if the volume research does not exist, the error message "volume group does not exist" 225 | should be displayed. 226 | vii. Don't mount the logical volume in any way. 227 | 228 | ``` bash 229 | - name: lvm playbook 230 | hosts: all 231 | become: true 232 | tasks: 233 | - name: checking details 234 | block: 235 | - name: if the volume research does not exist 236 | debug: 237 | msg: "volume group does not exist" 238 | when: "'research' not in ansible_lvm.vgs" 239 | - name: creating the 1200m lvm 240 | lvol: 241 | vg: research 242 | Lv: data 243 | size: 1200m 244 | when: "'research' in ansible_lvm.vgs" 245 | rescue: 246 | - name: if the requested logical volume size cannot be cretaed 247 | debug: 248 | msg: "Could not create logical volume of that size" 249 | - name: creating the logical volume of 800m 250 | lvol: 251 | vg : research 252 | lv: data 253 | size: 800m 254 | always: 255 | - name: format filesystem 256 | filesystem: 257 | fstype: ext4 258 | dev: /dev/research/data 259 | when: "'data' in ansible_lvm.lvs" 260 | ``` 261 | -------------------------------------------------------------------------------- /06-conditions-et-loops.md: -------------------------------------------------------------------------------- 1 |

Les conditions & les boucles

2 | 3 | ### Introduction 4 | 👋 Dans cette section, nous allons explorer comment utiliser les Loops et les Conditions en Ansible. 5 | 6 | ### Loop en Ansible 7 | Ansible permet d'itérer sur une liste d'éléments en utilisant des boucles. Cela simplifie les tâches répétitives. Voici une explication avec des exemples concrets. 8 | - `Loop simple avec liste intégrée` : Itère directement sur une liste définie dans le playbook. 9 | - `Loop simple avec fichier de variables` : Itère sur une liste définie dans un fichier de variables externe. 10 | - `Loop avec dictionnaire` : Itère sur une liste de dictionnaires, permettant d'accéder à plusieurs valeurs associées à chaque élément. 11 | #### Exemple 1 : Boucle simple avec une liste intégrée 12 | ```bash 13 | - hosts: all 14 | tasks: 15 | - name: afficher la liste 16 | shell: echo "{{ item }}" 17 | loop: 18 | - "one" 19 | - "two" 20 | - "three" 21 | 22 | ``` 23 | NB: 24 | `item` : C'est une variable spéciale utilisée à l'intérieur de la boucle pour représenter l'élément actuel de la liste. 25 | `loop`: Contient la liste des éléments sur lesquels itérer. 26 | #### Exemple 2 : Boucle simple avec un fichier de variables 27 | 28 | ```bash 29 | vim simple_loop.yml 30 | ``` 31 | 32 | ```bash 33 | numbers: 34 | - "one" 35 | - "two" 36 | - "three" 37 | 38 | ``` 39 | 40 | ```bash 41 | vim playbook.yml 42 | 43 | ``` 44 | 45 | ```bash 46 | - hosts: all 47 | vars_files: 48 | - simple_loop.yml 49 | tasks: 50 | - name: afficher la liste 51 | shell: echo "{{ item }}" 52 | loop: "{{ numbers }}" 53 | 54 | ``` 55 | NB: le playbook utilise la liste numbers définie dans `simple_loop.yml`. 56 | #### Exemple 3 : Boucle avec un dictionnaire 57 | 58 | ```bash 59 | vim dict_loop.yml 60 | ``` 61 | ```bash 62 | users: 63 | - username: user1 64 | his_group: group1 65 | - username: user2 66 | his_group: group2 67 | - username: user3 68 | his_group: group3 69 | 70 | ``` 71 | ```bash 72 | vim playbook.yml 73 | ``` 74 | ```bash 75 | - hosts: all 76 | vars_files: 77 | - dict_loop.yml 78 | tasks: 79 | - name: afficher la liste 80 | debug: 81 | msg: this is the user "{{ item.username }}" and his group is "{{ item.his_group }}" 82 | loop: "{{ users }}" 83 | 84 | ``` 85 | NB: 86 | - `users`: Contient une liste de dictionnaires, chaque dictionnaire ayant les clés `username` et `his_group`. 87 | - loop: "{{ users }}" : Utilise la liste `users` définie dans `dict_loop.yml`. 88 | - `item.username` et `item.his_group` : Accède aux valeurs du dictionnaire actuel dans la boucle. 89 | On peut maintenant utiliser les loops pour l'exercice de httpd 90 |

91 | dans la fin de cette section 92 |

93 | 94 | comme suivant: 95 | ```bash 96 | vim services.yml 97 | ``` 98 | ```bash 99 | services: 100 | - httpd 101 | - firewalld 102 | ``` 103 | ```bash 104 | vim httpd.yml 105 | ``` 106 | ```bash 107 | - hosts: all 108 | become: true 109 | vars_files: 110 | - services.yml 111 | tasks: 112 | - name: install packages 113 | yum: 114 | name: "{{item}}" 115 | state: present 116 | loop: "{{services}}" 117 | - name: enable httpd service 118 | service: 119 | name: "{{item}}" 120 | state: started 121 | enabled: yes 122 | loop: "{{services}}" 123 | - name: create index 124 | copy: 125 | content: "hello" 126 | dest: /var/www/html/index.html 127 | setype: httpd_sys_content_t 128 | - name: allow httpd service 129 | firewalld: 130 | service: http 131 | permanent: yes 132 | state: enabled 133 | immediate: yes 134 | 135 | ``` 136 | ### When en Ansible 137 | La condition when en Ansible permet d'exécuter des tâches uniquement si certaines conditions sont remplies. Si la condition n'est pas remplie, la tâche est ignorée, et Ansible indique cette action dans la sortie `skipping` 138 | #### Exemple de Playbook avec when: 139 | ```bash 140 | - name: Install vim in CentOS and Ubuntu nodes 141 | hosts: web 142 | tasks: 143 | - name: Install vim on Centos 144 | yum: 145 | name: vim 146 | state: present 147 | when: ansible_facts['distribution'] == "CentOS" 148 | 149 | - name: Install vim on Ubuntu 150 | apt: 151 | name: vim 152 | state: present 153 | when: ansible_facts['distribution'] == "Ubuntu" 154 | 155 | ``` 156 | On peut maintenant utiliser les conditions pour la question 157 |

158 | dans la fin de cette section 159 |

160 | 161 | tel que "If a disk does not exist then write NONE" comme suivant: 162 | ``` bash 163 | 164 | - name: QUESTION CORRECTION 165 | hosts: all 166 | become: true 167 | tasks: 168 | - name: change hostname 169 | lineinfile: 170 | path: /root/report.txt 171 | line: HOST={{ ansible_hostname }} 172 | regexp: ^HOST 173 | state: present 174 | - name: chahge memory 175 | lineinfile: 176 | path: /root/report.txt 177 | line: MEMORY={{ ansible_memtotal_mb }} 178 | regexp: ^MEMORY 179 | state: present 180 | - name: change bios version 181 | lineinfile: 182 | path: /root/report.txt 183 | line: BIOS={{ ansible_bios_version }} 184 | regexp: ^BIOS 185 | state: present 186 | - name: change sda if there is sda 187 | lineinfile: 188 | path: /root/report.txt 189 | line: SDA_DISK_SIZE={{ ansible_devices.sda.size }} 190 | regexp: ^SDA_DISK_SIZE 191 | state: present 192 | when: "'sda' in ansible_devices " 193 | - name: change sda if there is no sda 194 | lineinfile: 195 | path: /root/report.txt 196 | line: SDA_DISK_SIZE= NONE 197 | regexp: ^SDA_DISK_SIZE 198 | state: present 199 | when: "'sda' not in ansible_devices " 200 | - name: change sdb if there is sdb 201 | lineinfile: 202 | path: /root/report.txt 203 | line: SDA_DISK_SIZE={{ ansible_devices.sdb.size }} 204 | regexp: ^SDB_DISK_SIZE 205 | state: present 206 | when: "'sdb' in ansible_devices " 207 | - name: change sda if there is no sdb 208 | lineinfile: 209 | path: /root/report.txt 210 | line: SDB_DISK_SIZE= NONE 211 | regexp: ^SDB_DISK_SIZE 212 | state: present 213 | when: "'sdb' not in ansible_devices " 214 | 215 | ``` 216 | ### QUESTION: 217 | 0. your inventory is 218 | ```bash 219 | [dev] 220 | node1 221 | [proxy] 222 | node2 223 | ``` 224 | 1. Create an ansible vault password file called lock.yml with the password reallysafepw in the /home/ansible directory. In the lock.yml file define two variables. One is pw_dev and the password is ‘dev’ and the other is pw_mgr and the password is ‘mgr’. Create a regular file called secret.txt which contains the password for lock.yml. 225 | 226 | 2. Create the users in the file users_list.yml file provided. Do this in a playbook called users.yml located at /home/ansible. The passwords for these users should be set using the lock.yml file. When running the playbook, the lock.yml file should be unlocked with secret.txt file. 227 | users_list.yml 228 | ```bash 229 | users: 230 | - username: bill 231 | job: developer 232 | - username: chris 233 | job: manager 234 | - username: dave 235 | job: test 236 | - username: ethan 237 | job: developer 238 | ``` 239 | 3. All users with the job of ‘developer’ should be created on the dev hosts, add them to the group devops, their password should be set using the pw_dev variable. Likewise create users with the job of ‘manager’ on the proxy host and add the users to the group ‘managers’, their password should be set using the pw_mgr variable. 240 | 241 | NB: inventory_hostname est le nom que vous donnez à l'hôte dans votre fichier d'inventaire(/etc/hosts+inventory), tandis que ansible_hostname est le nom que l'hôte distant utilise pour se référencer lui-même(facts -> hostname). 242 | 243 | ```bash 244 | ansible-vault create lock.yml 245 | ``` 246 | ```bash 247 | vim secret.txt 248 | ``` 249 | ```bash 250 | - hosts: all 251 | become: true 252 | vars_files: 253 | - lock.yml 254 | - users_list.yml 255 | tasks: 256 | - name: create groups 257 | group: 258 | name: "{{item}}" 259 | state: present 260 | loop: 261 | - managers 262 | - devops 263 | - name: create developers on dev hosts 264 | user: 265 | name: "{{item.username}}" 266 | group: devops 267 | password: "{{pw_dev | password_hash('sha512')}}" 268 | loop: "{{users}}" 269 | when: "item.job == 'developer' and inventory_hostname in groups['dev']" 270 | - name: create managers on proxy hosts 271 | user: 272 | name: "{{item.username}}" 273 | group: managers 274 | password: "{{pw_mgr | password_hash('sha512')}}" 275 | loop: "{{users}}" 276 | when: "item.job == 'manager' and inventory_hostname in groups['proxy']" 277 | 278 | ``` 279 | ## QUESTION 280 | Create a playbook called webdev.yml in /home/ansible. The playbook will create a directory /webdev on dev host. The permission of the directory is u=rwx,g=rw, other has no permission. 281 | Set group id for the folder and owner is webdev. 282 | Create a symbolic link from /webdev to /var/www/html/webdev. 283 | Serve a file from /webdev/index.html which displays the text “Development”. 284 | Curl http://node1.example.com/webdev/index.html to test 285 | ```bash 286 | ansible-galaxy collection install community.general 287 | ``` 288 | ```bash 289 | - name: web development 290 | hosts: dev 291 | become: true 292 | tasks: 293 | - name: create webdev user 294 | user: 295 | name: webdev 296 | state: present 297 | - name: create directory 298 | file: 299 | path: /webdev 300 | state: directory 301 | owner: webdev 302 | mode: 2760 303 | - name: create symbolic link 304 | file: 305 | src: /webdev 306 | path: /var/www/html/webdev 307 | state: link 308 | - name: create index.html 309 | copy: 310 | content: Development 311 | dest: /var/www/html/webdev/index.html 312 | - name: allow httpd from custom directory 313 | sefcontext: 314 | target: '/webdev(/.*)?' 315 | setype: httpd_sys_content_t 316 | state: present 317 | - name: restore the context 318 | shell: restorecon -vR /webdev 319 | - name: test 320 | uri: 321 | url: http://node1/webdev/ #do not forget the last / to avoid the 301 Moved permanently error 322 | ``` 323 | 324 | to see the content you should do 325 | ```bash 326 | ansible node1 -m command -a "curl http://node1/webdev/ " 327 | ``` 328 | --------------------------------------------------------------------------------