Ceci est une ancienne révision du document !
Table des matières
Version - 2023.01
Dernière mise-à-jour : 2023/09/21 14:06
LDF905 - Automatiser l'Administration Système de CentOS 8
Contenu du Module
- LDF905 - Automatiser l'Administration Système de CentOS 8
- Contenu du Module
- LAB #1 - Gestion des Utilisateurs et des Mots de Passe
- 1.1 - Configurer SSH et sudo
- 1.2 - Configurer Ansible
- 1.3 - Créer un Utilisateur Unique
- 1.4 - Supprimer un Utilisateur Unique
- 1.5 - Créer de Multiples Utilisateurs
- 1.6 - Supprimer de Multiples Utilisateurs
- 1.7 - Créer un Utilisateur en utilisant une Variable
- 1.8 - Gestion des Mots de Passe
- 1.9 - Créer un Utilisateur Dédié pour Ansible
- LAB #2 - Configurer le Serveur SSHD
- 2.1 - Interdire des Connexions par Root
LAB #1 - Gestion des Utilisateurs et des Mots de Passe
Connectez-vous à la machine virtuelle CentOS_8 :
trainee@debian11:~$ ssh -l trainee 10.0.2.45 The authenticity of host '10.0.2.45 (10.0.2.45)' can't be established. ECDSA key fingerprint is SHA256:Q7T/CP0SLiMbMAIgVzTuEHegYS/spPE5zzQchCHD5Vw. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '10.0.2.45' (ECDSA) to the list of known hosts. trainee@10.0.2.45's password: Activate the web console with: systemctl enable --now cockpit.socket Last login: Thu Feb 16 16:46:22 2023 from 10.0.2.1 [trainee@centos8 ~]$ ls -la | grep .ssh [trainee@centos8 ~]$ mkdir .ssh [trainee@centos8 ~]$ chmod 700 .ssh [trainee@centos8 ~]$ ls -la | grep .ssh drwx------. 2 trainee trainee 4096 Sep 20 09:50 .ssh [trainee@centos8 ~]$ exit logout Connection to 10.0.2.45 closed.
1.1 - Configurer SSH et sudo
Copiez le fichier .ssh/authorized_keys vers /home/trainee/.ssh/ :
trainee@debian11:~$ scp .ssh/authorized_keys trainee@10.0.2.45:/home/trainee/.ssh/authorized_keys trainee@10.0.2.45's password: authorized_keys 100% 846 1.3MB/s 00:00
Testez la connexion SSH :
trainee@debian11:~$ ssh -l trainee 10.0.2.45 Activate the web console with: systemctl enable --now cockpit.socket Last login: Wed Sep 20 09:49:19 2023 from 10.0.2.46 [trainee@centos8 ~]$
Créez le fichier /etc/sudoers.d/ansible_users :
[root@centos8 ~]# vi /etc/sudoers.d/ansible_users [root@centos8 ~]# cat /etc/sudoers.d/ansible_users trainee ALL=(ALL) NOPASSWD:ALL [root@centos8 ~]# chmod 440 /etc/sudoers.d/ansible_users [root@centos8 ~]# ls -l /etc/sudoers.d/ansible_users -r--r-----. 1 root root 37 Sep 20 09:56 /etc/sudoers.d/ansible_users
Vérifiez que vous pouvez devenir l'utilisateur root sans saisir de mot de passe :
[root@centos8 ~]# exit logout [trainee@centos8 ~]$ sudo su - [root@centos8 ~]# exit logout [trainee@centos8 ~]$ exit logout Connection to 10.0.2.45 closed. trainee@debian11:~$
1.2 - Configurer Ansible
Pour gérer les utilisateurs, nous devons faire appel au module users. Pour obtenir de l'information sur ce module, utilisez la commande ansible-doc :
trainee@debian11:~$ ansible-doc user > ANSIBLE.BUILTIN.USER (/usr/lib/python3/dist-packages/ansible/modules/user.py) Manage user accounts and user attributes. For Windows targets, use the [ansible.windows.win_user] module instead. OPTIONS (= is mandatory): - append If `yes', add the user to the groups specified in `groups'. If `no', user will only be added to the groups specified in `groups', removing them from all other groups. [Default: False] type: bool - authorization Sets the authorization of the user. Does nothing when used with other platforms. Can set multiple authorizations using comma separation. To delete all authorizations, use `authorization='''. Currently supported on Illumos/Solaris. [Default: (null)] type: str version_added: 2.8 :
Créez maintenant les répertoires hots_vars et group_vars dans le rôle users :
trainee@debian11:~$ mkdir -p ansible/users/host_vars trainee@debian11:~$ mkdir -p ansible/users/group_vars
Placez-vous dans le rôle :
trainee@debian11:~$ cd ansible/users/ trainee@debian11:~/ansible/users$
Constatez le fichier de configuration d'ansible actuellement utilisé :
trainee@debian11:~/ansible/users$ ansible --version ansible 2.10.8 config file = None configured module search path = ['/home/trainee/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3/dist-packages/ansible executable location = /usr/bin/ansible python version = 3.9.2 (default, Feb 28 2021, 17:03:44) [GCC 10.2.1 20210110]
Puisque la valeur est none, créez le fichier ansible.cfg :
trainee@debian11:~/ansible/users$ vi ansible.cfg trainee@debian11:~/ansible/users$ cat ansible.cfg [defaults] inventory = inventory remote_user = trainee [privilege_escalation] become = true become_method = sudo become_user = root
Vérifiez la prise en compte de ce fichier :
trainee@debian11:~/ansible/users$ ansible --version ansible 2.10.8 config file = /home/trainee/ansible/users/ansible.cfg configured module search path = ['/home/trainee/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3/dist-packages/ansible executable location = /usr/bin/ansible python version = 3.9.2 (default, Feb 28 2021, 17:03:44) [GCC 10.2.1 20210110]
trainee@debian11:~/ansible/users$ ansible-config view [defaults] inventory = inventory remote_user = trainee [privilege_escalation] become = true become_method = sudo become_user = root
Pour voir l'ensemble des variables possibles, utilisez la commande ansible-config list :
trainee@debian11:~/ansible/users$ ansible-config list ACTION_WARNINGS: default: true description: - By default Ansible will issue a warning when received from a task action (module or action plugin) - These warnings can be silenced by adjusting this setting to False. env: - name: ANSIBLE_ACTION_WARNINGS ini: - key: action_warnings section: defaults name: Toggle action warnings type: boolean version_added: '2.5' AGNOSTIC_BECOME_PROMPT: default: true description: Display an agnostic become prompt instead of displaying a prompt conta> the command line supplied become method env: - name: ANSIBLE_AGNOSTIC_BECOME_PROMPT ini: - key: agnostic_become_prompt section: privilege_escalation :
Pour consulter l'ensemble des valeurs actuelles des variables, utilisez la commande ansible-config dump :
trainee@debian11:~/ansible/users$ ansible-config dump ACTION_WARNINGS(default) = True AGNOSTIC_BECOME_PROMPT(default) = True ALLOW_WORLD_READABLE_TMPFILES(default) = False ANSIBLE_CONNECTION_PATH(default) = None ANSIBLE_COW_PATH(default) = None ANSIBLE_COW_SELECTION(default) = default ANSIBLE_COW_WHITELIST(default) = ['bud-frogs', 'bunny', 'cheese', 'daemon', 'default'> ANSIBLE_FORCE_COLOR(default) = False ANSIBLE_NOCOLOR(default) = False ANSIBLE_NOCOWS(default) = False ANSIBLE_PIPELINING(default) = False ANSIBLE_SSH_ARGS(default) = -C -o ControlMaster=auto -o ControlPersist=60s ANSIBLE_SSH_CONTROL_PATH(default) = None ANSIBLE_SSH_CONTROL_PATH_DIR(default) = ~/.ansible/cp ANSIBLE_SSH_EXECUTABLE(default) = ssh ANSIBLE_SSH_RETRIES(default) = 0 ANY_ERRORS_FATAL(default) = False BECOME_ALLOW_SAME_USER(default) = False BECOME_PLUGIN_PATH(default) = ['/home/trainee/.ansible/plugins/become', '/usr/share/a> CACHE_PLUGIN(default) = memory CACHE_PLUGIN_CONNECTION(default) = None CACHE_PLUGIN_PREFIX(default) = ansible_facts CACHE_PLUGIN_TIMEOUT(default) = 86400 :
Pour ne consulter que les valeurs modifiées, utilisez l'option –only-changed :
trainee@debian11:~/ansible/users$ ansible-config dump --only-changed DEFAULT_BECOME(/home/trainee/ansible/users/ansible.cfg) = True DEFAULT_BECOME_METHOD(/home/trainee/ansible/users/ansible.cfg) = sudo DEFAULT_BECOME_USER(/home/trainee/ansible/users/ansible.cfg) = root DEFAULT_HOST_LIST(/home/trainee/ansible/users/ansible.cfg) = ['/home/trainee/ansible/> DEFAULT_REMOTE_USER(/home/trainee/ansible/users/ansible.cfg) = trainee (END)
Pour informer Ansible du type de connexion à utiliser pour contacter le contrôleur, injectez les texte ansible_connection: local dans le fichier host_vars/10.0.2.46 :
trainee@debian11:~/ansible/users$ echo "ansible_connection: local" > host_vars/10.0.2.46
Créez le fichier inventory :
trainee@debian11:~/ansible/users$ vi inventory trainee@debian11:~/ansible/users$ cat inventory [centos] 10.0.2.45
1.3 - Créer un Utilisateur Unique
Créez ensuite le fichier user1.yml :
trainee@debian11:~/ansible/users$ vi user1.yml trainee@debian11:~/ansible/users$ cat user1.yml --- - name: User Creation hosts: all gather_facts: false become: true tasks: - name: Create User user: name: 'jodi'
Vérifiez la syntaxe du fichier créé :
trainee@debian11:~/ansible/users$ ansible-playbook user1.yml --syntax playbook: user1.yml
En exécutant le playbook, on peut constater qu'une modification a eu lieu dans la VM 10.0.2.45 :
trainee@debian11:~/ansible/users$ ansible-playbook user1.yml PLAY [User Creation] ********************************************************************************************************************************************************************************************* TASK [Create User] *********************************************************************************************************************************************************************************************** changed: [10.0.2.45] PLAY RECAP ******************************************************************************************************************************************************************************************************* 10.0.2.45 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Vérifiez que cette modification est celle attendue :
trainee@debian11:~/ansible/users$ ansible all -m command -a 'getent passwd jodi' 10.0.2.45 | CHANGED | rc=0 >> jodi:x:1001:1001::/home/jodi:/bin/bash
1.4 - Supprimer un Utilisateur Unique
Modifiez le fichier user1.yml :
trainee@debian11:~/ansible/users$ vi user1.yml trainee@debian11:~/ansible/users$ cat user1.yml --- - name: Delete User hosts: all gather_facts: false become: true tasks: - name: Delete User Account user: name: 'jodi' state: 'absent' remove: true
Important : Notez l'utilisation de remove qui permet de supprimer le répertoire personnel de l'utilisateur, son spool de mail et ses cronjobs éventuels.
Exécutez le playbook :
trainee@debian11:~/ansible/users$ ansible-playbook user1.yml PLAY [Delete User] ******************************************************************* TASK [Delete User Account] *********************************************************** changed: [10.0.2.45] PLAY RECAP *************************************************************************** 10.0.2.45 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
1.5 - Créer de Multiples Utilisateurs
Modifiez le fichier user1.yml :
trainee@debian11:~/ansible/users$ vi user1.yml trainee@debian11:~/ansible/users$ cat user1.yml --- - name: Multiple Users hosts: all become: true tasks: - name: create multiple accounts user: name: "{{ item }}" loop: - user1 - user2 - user3
Important : Notez l'utilisation de “item“ et loop qui permettent l'exécution d'un boucle pour la création des trois utilisateurs. DAns le cas où la version d'ansible < 2.5, il convient de remplacer loop avec with_items.
Exécutez le playbook :
trainee@debian11:~/ansible/users$ ansible-playbook user1.yml PLAY [Multiple Users] **************************************************************** TASK [Gathering Facts] *************************************************************** ok: [10.0.2.45] TASK [create multiple accounts] ****************************************************** changed: [10.0.2.45] => (item=user1) changed: [10.0.2.45] => (item=user2) changed: [10.0.2.45] => (item=user3) PLAY RECAP *************************************************************************** 10.0.2.45 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Constatez la création des trois utilisateurs :
trainee@debian11:~/ansible/users$ ansible all -m command -a 'getent passwd user1' 10.0.2.45 | CHANGED | rc=0 >> user1:x:1001:1001::/home/user1:/bin/bash trainee@debian11:~/ansible/users$ ansible all -m command -a 'getent passwd user2' 10.0.2.45 | CHANGED | rc=0 >> user2:x:1002:1002::/home/user2:/bin/bash trainee@debian11:~/ansible/users$ ansible all -m command -a 'getent passwd user3' 10.0.2.45 | CHANGED | rc=0 >> user3:x:1003:1003::/home/user3:/bin/bash
Constatez la création des répertoires personnels :
trainee@debian11:~/ansible/users$ ansible all -m command -a 'ls -l /home' 10.0.2.45 | CHANGED | rc=0 >> total 32 drwx------. 2 root root 16384 Jul 19 2021 lost+found drwxr-xr-x. 19 trainee trainee 4096 Sep 20 09:59 trainee drwx------. 3 user1 user1 4096 Sep 20 11:37 user1 drwx------. 3 user2 user2 4096 Sep 20 11:37 user2 drwx------. 3 user3 user3 4096 Sep 20 11:37 user3
1.6 - Supprimer de Multiples Utilisateurs
Modifiez le fichier user1.yml :
trainee@debian11:~/ansible/users$ vi user1.yml trainee@debian11:~/ansible/users$ cat user1.yml --- - name: Multiple Users hosts: all become: true tasks: - name: delete multiple accounts user: name: "{{ item }}" state: 'absent' remove: true loop: - user1 - user2 - user3
Exécutez le playbook :
trainee@debian11:~/ansible/users$ ansible-playbook user1.yml PLAY [Multiple Users] ******************************************************************************************************************************************************************************************** TASK [Gathering Facts] ******************************************************************************************************************************************************************************************* ok: [10.0.2.45] TASK [delete multiple accounts] ********************************************************************************************************************************************************************************** changed: [10.0.2.45] => (item=user1) changed: [10.0.2.45] => (item=user2) changed: [10.0.2.45] => (item=user3) PLAY RECAP ******************************************************************************************************************************************************************************************************* 10.0.2.45 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Vérifiez la suppression d'un des utilisateurs ainsi que son répertoire personnel :
trainee@debian11:~/ansible/users$ ansible all -m command -a 'getent passwd user1' 10.0.2.45 | FAILED | rc=2 >> non-zero return code trainee@debian11:~/ansible/users$ ansible all -m command -a 'ls -l /home' 10.0.2.45 | CHANGED | rc=0 >> total 20 drwx------. 2 root root 16384 Jul 19 2021 lost+found drwxr-xr-x. 19 trainee trainee 4096 Sep 20 09:59 trainee
1.7 - Créer un Utilisateur en utilisant une Variable
Modifiez le fichier user1.yml :
trainee@debian11:~/ansible/users$ vi user1.yml trainee@debian11:~/ansible/users$ cat user1.yml --- - name: User Creation from Variable hosts: all gather_facts: false become: true tasks: - name: Create User Account user: name: "{{ user_name }}"
Important : Notez l'utilisation de la variable user_name.
Exécutez le playbook en passant la valeur de la variable user_name sur la ligne de commande :
trainee@debian11:~/ansible/users$ ansible-playbook -e "user_name=user4" user1.yml PLAY [User Creation from Variable] *************************************************** TASK [Create User Account] *********************************************************** changed: [10.0.2.45] PLAY RECAP *************************************************************************** 10.0.2.45 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Vérifiez la création de l'utilisateur :
trainee@debian11:~/ansible/users$ ansible all -m command -a 'getent passwd user4' 10.0.2.45 | CHANGED | rc=0 >> user4:x:1001:1001::/home/user4:/bin/bash
1.8 - Gestion des Mots de Passe
Jusqu'à maintenant, nous nous ne sommes pas occupé de la création des mots de passe. Modifiez donc le fichier user1.yml :
trainee@debian11:~/ansible/users$ vi user1.yml trainee@debian11:~/ansible/users$ cat user1.yml --- - name: Manage Users hosts: all gather_facts: false become: true tasks: - name: Create User Account user: name: "{{ user_name }}" password: "{{ 'trainee' | password_hash('sha512', 'A512') }}" update_password: on_create when: user_create == 'yes' - name: Delete User Account user: name: "{{ user_name }}" state: 'absent' remove: true when: user_create == 'no'
Important : Notez la création de deux tâches : Create User Account et Delete User Account. L'exécution de la tâche est conditionnée par la valeur de la variable user_create qui sera passée sur la ligne de commande lors de l’exécution du playbook. Notez que le mot de passe trainee est hashé grâce à l'utilisation de password_hash('algorithme', 'salt') où salt est du texte aléatoire. Dernièrement update_password: on_create implique que le mot de passe sera créé pour l'utilisateur spécifié par la valeur de la variable user_name uniquement lors de sa création.
Créez donc l'utilisateur user1 :
trainee@debian11:~/ansible/users$ ansible-playbook -e "user_create=yes user_name=user1" user1.yml PLAY [Manage Users] ********************************************************************************************************************************************************************************************** TASK [Create User Account] *************************************************************************************************************************************************************************************** changed: [10.0.2.45] TASK [Delete User Account] *************************************************************************************************************************************************************************************** skipping: [10.0.2.45] PLAY RECAP ******************************************************************************************************************************************************************************************************* 10.0.2.45 : ok=1 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
Modifiez la valeur de la variable user_create pour supprimer l'utilisateur user1.yml :
trainee@debian11:~/ansible/users$ ansible-playbook -e "user_create=no user_name=user1" user1.yml PLAY [Manage Users] ********************************************************************************************************************************************************************************************** TASK [Create User Account] *************************************************************************************************************************************************************************************** skipping: [10.0.2.45] TASK [Delete User Account] *************************************************************************************************************************************************************************************** changed: [10.0.2.45] PLAY RECAP ******************************************************************************************************************************************************************************************************* 10.0.2.45 : ok=1 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
1.9 - Créer un Utilisateur Dédié pour Ansible
Créez le fichier devops.yml :
trainee@debian11:~/ansible/users$ vi devops.yml trainee@debian11:~/ansible/users$ cat devops.yml --- - name: Deploy devops account hosts: all become: true tasks: - name: create account user: name: devops - name: sudo access copy: dest: /etc/sudoers.d/devops content: 'devops ALL=(ALL) NOPASSWD: ALL' validate: /usr/sbin/visudo -cf %s - name: ssh key authorized_key: user: devops state: present manage_dir: true key: "{{ lookup( 'file', '/home/trainee/.ssh/id_rsa.pub') }}"
Important : Notez la création de trois tâches : create account, sudo access et ssh key. Dans la tâche create account, aucun mot de passe n'est spécifié car l'utilisateur s'authentifiera par clefs. Dans la tâche sudo access, la chaîne devops ALL=(ALL) NOPASSWD: ALL est injecté dans le fichier /etc/sudoers.d/devops dont le contenu sera ensuite validé par l'utilisation de la commande /usr/sbin/visudo -cf %s ou %s et /etc/sudoers.d/devops. Dans la tâche ssh key, le module authorized_key est utilisé. Ce module permet la création, si besoin, du répertoire .ssh de l'utilisateur devops qui doit être present grâce à manage_dir: true. La valeur de key de devops est créer par la copie du contenu du fichier /home/trainee/.ssh/id_rsa.pub.
Vérifiez la syntaxe du fichier :
trainee@debian11:~/ansible/users$ ansible-playbook devops.yml --syntax playbook: devops.yml
Exécutez le playbook :
trainee@debian11:~/ansible/users$ ansible-playbook devops.yml PLAY [Deploy devops account] ************************************************************************************************************************************************************************************* TASK [Gathering Facts] ******************************************************************************************************************************************************************************************* ok: [10.0.2.45] TASK [create account] ******************************************************************************************************************************************************************************************** changed: [10.0.2.45] TASK [sudo access] *********************************************************************************************************************************************************************************************** changed: [10.0.2.45] TASK [ssh key] *************************************************************************************************************************************************************************************************** changed: [10.0.2.45] PLAY RECAP ******************************************************************************************************************************************************************************************************* 10.0.2.45 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Testez la connexion SSH pour le compte devops :
trainee@debian11:~/ansible/users$ ssh -l devops 10.0.2.45 Activate the web console with: systemctl enable --now cockpit.socket [devops@centos8 ~]$ whoami devops [devops@centos8 ~]$ exit logout Connection to 10.0.2.45 closed.
LAB #2 - Configurer le Serveur SSHD
2.1 - Interdire des Connexions par Root
Créez le fichier ssh.yaml :
trainee@debian11:~/ansible/users$ vi ssh.yml trainee@debian11:~/ansible/users$ cat ssh.yml --- - name: sshd hosts: all gather_facts: false handlers: - name: restart_sshd systemd: name: sshd.service state: restarted tasks: - name: Enable SSHD systemd: name: sshd enabled: true state: started - name: No Root lineinfile: path: /etc/ssh/sshd_config regexp: '^PermitRootLogin' insertafter: '#LoginGraceTime' line: 'PermitRootLogin no' notify: restart_sshd
Important : Notez la création d'un handler nommé restart_sshd. Deux tâches sont créées : Enable SSHD et No Root. Enable SSHD sert à activer et à démarrer le service sshd en utilisant le module systemd tandis que No Root édite le fichier /etc/ssh/sshd_config afin d'empêcher les connexions directes par l'utilisateur root. Notez l'utilisation du module lineinfile qui recherche une expression régulière regexp dans le fichier /etc/ssh/sshd_config et qui modifie la ligne en fonction de la valeur de line. La valeur d'insertafter spécifie la où doit être insérer la ligne si elle n'existe pas dans le fichier. Dernièrement en cas de modification du fichier le handler est appelé par notify.
Consultez la valeur de PermitRootLogin avant l'exécution du playbook :
trainee@debian11:~/ansible/users$ ansible all -m command -a 'grep PermitRootLogin /etc/ssh/sshd_config' 10.0.2.45 | CHANGED | rc=0 >> PermitRootLogin yes # the setting of "PermitRootLogin without-password".
Exécutez le playbook :
trainee@debian11:~/ansible/users$ ansible-playbook ssh.yml PLAY [sshd] ****************************************************************************************************************************************************************************************************** TASK [Enable SSHD] *********************************************************************************************************************************************************************************************** ok: [10.0.2.45] TASK [No Root] *************************************************************************************************************************************************************************************************** changed: [10.0.2.45] RUNNING HANDLER [restart_sshd] *********************************************************************************************************************************************************************************** changed: [10.0.2.45] PLAY RECAP ******************************************************************************************************************************************************************************************************* 10.0.2.45 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Consultez la valeur de PermitRootLogin après l'exécution du playbook :
trainee@debian11:~/ansible/users$ ansible all -m command -a 'grep PermitRootLogin /etc/ssh/sshd_config' 10.0.2.45 | CHANGED | rc=0 >> PermitRootLogin no # the setting of "PermitRootLogin without-password".
Important : Notez la modification de la valeur de PermitRootLogin.
Dernièrement, exécutez de nouveau le playbook :
trainee@debian11:~/ansible/users$ ansible-playbook ssh.yml PLAY [sshd] ********************************************************************************************** TASK [Enable SSHD] *************************************************************************************** ok: [10.0.2.45] TASK [No Root] ******************************************************************************************* ok: [10.0.2.45] PLAY RECAP *********************************************************************************************** 10.0.2.45 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Important : Notez que le handler n'a pas été appelé car le fichier /etc/ssh/sshd_config n'a pas été modifié.
Copyright © 2023 Hugh Norris.