Ceci est une ancienne révision du document !
Table des matières
Version - 2023.01
Dernière mise-à-jour : 2023/09/21 11:13
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 #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 et 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_dirs: true key: "{{ lookup( 'file', '/home/trainee/.ssh/id_rsa.pub') }}"
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 et 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.
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.
Copyright © 2023 Hugh Norris.