Ceci est une ancienne révision du document !


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.

Menu