GNU/Linux >> Tutoriels Linux >  >> Linux

Comment créer un utilisateur Linux avec Ansible

Ansible est un outil de provisionnement de logiciels open source, de gestion de la configuration et de déploiement d'applications permettant l'infrastructure en tant que code. Il fonctionne sur de nombreux systèmes de type Unix et peut configurer à la fois des systèmes de type Unix et Microsoft Windows.

Prérequis

Pour suivre ce guide, vous avez besoin des éléments suivants :

  • python installé dans le système local
  • Pip Python installé
  • Ansible installé localement

Étapes

  1. Installer les dépendances
  2. Générer le mot de passe à l'aide du package passlib
  3. Créer le playbook ansible définissant les tâches requises
  4. Tout le livre de jeu

1. Installer les dépendances

Pour que cela fonctionne, nous avons besoin d'ansible et du package passlib.

Installez le package ansible passlib :

sudo pip install passlib

Installer ansible

sudo pip install ansible

2. Générez le mot de passe à l'aide du package passlib

Ansible ajoutera le mot de passe tel quel pour l'utilisateur. Le mot de passe est crypté donc le mot de passe par défaut ne fonctionnera pas.

Obtenez le mot de passe chiffré avec cette commande :

python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"

Sortie :

➜ python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"

Password:
$6$8IAGh7Gu2ugAB.sF$zHldDAEBMoiFUPq2RsGpQ.TRwbPOz3/S5ATs5TbfWDLypYjLGfKN8SNxu1Sx5nNfzQgDJqBh37jT9ln7EIHcq0

3. Créer le playbook ansible définissant les tâches requises

Maintenant que toutes les dépendances sont installées, définissons notre playbook.

Vous devez d'abord définir le nom, les hôtes et des informations supplémentaires comme les variables :

- name: Create user on a linux server
  hosts: remote-server
  become: yes
  gather_facts: false
  vars:
    - user: <username here>
    - password: <Password hash generated>

La section suivante concerne les tâches.

Tâche Ansible pour créer un utilisateur Linux

Puisque nous voulons créer un utilisateur, nous allons utiliser l'ansible user module. En savoir plus sur le module utilisateur ici.

Cette tâche créera un utilisateur avec le name fourni et password qui sera interpolée à partir des variables définies précédemment :

- name: Create a login user
  user:
    name: "{{ user }}"
    password: "{{ password }}"
    groups:
      - wheel
    state: present

Facultatif :Tâche ansible pour ajouter la clé publique aux clés autorisées pour l'utilisateur

Pour permettre une connexion sans mot de passe au serveur, nous pouvons ajouter notre clé ssh publique aux clés autorisées sur le serveur. Le module ansible authorized_key est utilisé pour y parvenir.

- name: Add public key to authorized_keys
  authorized_key:
    user: "{{ user }}"
    state: present
    key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"

Facultatif :Tâche Ansible pour refuser l'accès root ssh

L'étape suivante consiste à refuser la connexion root via ssh. C'est une bonne pratique d'autoriser les utilisateurs non root à se connecter. Nous utilisons le lineinfile module qui garantira qu'une ligne spécifique est présente dans le fichier spécifié. Nous utilisons une expression régulière pour faire correspondre la ligne.

- name: Deny root from logging in
  ansible.builtin.lineinfile:
    dest: /etc/ssh/sshd_config
    regexp: '^(#)?PermitRootLogin \w*$'
    line: 'PermitRootLogin no'
    state: present

Facultatif :Tâche possible pour ajouter un utilisateur à la liste des utilisateurs autorisés

Une bonne pratique de sécurité consiste à autoriser uniquement les utilisateurs spécifiés à se connecter au système. Cette tâche le fera.

- name: Allow specific users to log in
  ansible.builtin.lineinfile:
    dest: /etc/ssh/sshd_config
    regexp: '^AllowUsers'
    line: 'AllowUsers {{ user }}'
    state: present

Facultatif :Ajoutez un utilisateur au fichier sudoers afin qu'il puisse exécuter des commandes sudo :

Si vous souhaitez que l'utilisateur créé exécute la commande sudo sans invite de mot de passe, incluez cette tâche.

Ici, nous utilisons le lineinfile module pour rechercher une expression régulière correspondant à l'utilisateur puis valider que tout fonctionne comme prévu avec la commande visudo -cf %s :

- name: Add {{ user }} to sudoers file
  ansible.builtin.lineinfile:
    path: /etc/sudoers
    regexp: '^{{ user }}'
    line: '{{ user }} ALL=(ALL) NOPASSWD: ALL'
    validate: 'visudo -cf %s'

4. Tout le playbook

Voici à quoi ressemblera tout le livre de jeu. Enregistrez ce contenu dans un .yaml ou .yml dossier. Dans mon cas create-user.yaml :

---
- name: Create user on a linux server
  hosts: remote-server
  become: yes
  gather_facts: false
  vars:
    - user: user1
    - password: $6$8IAGh7Gu2ugAB.sF$zHldDAEBMoiFUPq2RsGpQ.TRwbPOz3/S5ATs5TbfWDLypYjLGfKN8SNxu1Sx5nNfzQgDJqBh37jT9ln7EIHcq0
  tasks:
      - name: Create a login user
        user:
          name: "{{ user }}"
          password: "{{ password }}"
          groups:
            - wheel
          state: present

      - name: Add public key to authorized_keys
        authorized_key:
          user: "{{ user }}"
          state: present
          key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"

      - name: Deny root from logging in
        ansible.builtin.lineinfile:
          dest: /etc/ssh/sshd_config
          regexp: '^(#)?PermitRootLogin \w*$'
          line: 'PermitRootLogin no'
          state: present

      - name: Allow specific users to log in
        ansible.builtin.lineinfile:
          dest: /etc/ssh/sshd_config
          regexp: '^AllowUsers'
          line: 'AllowUsers {{ user }}'
          state: present

      - name: Add {{ user }} to sudoers file
        ansible.builtin.lineinfile:
          path: /etc/sudoers
          regexp: '^{{ user }}'
          line: '{{ user }} ALL=(ALL) NOPASSWD: ALL'
          validate: 'visudo -cf %s'

5. Exécuter le playbook

Maintenant que nous avons le playbook créé dans le fichier create-user.yaml dans le répertoire courant, nous devons fournir un fichier hosts qui définira la connexion à notre serveur. À partir de la définition du playbook, nous définissons notre serveur comme remote-server . Ajoutons maintenant cela au fichier hosts.

Créez un fichier hosts.yaml avec le contenu suivant définissant le remote-server :

all:
  hosts:
    remote-server:
      ansible_ssh_host: 138.68.150.24
      ansible_ssh_user: root

Nous devons maintenant invoquer le ansible-playbook commande comme celle-ci :

ansible-playbook -i hosts.yaml create-user.yaml -vv

Dans la commande ci-dessus, le -i spécifie le fichier d'inventaire. Le -vv active la verbosité.

Voici la sortie de mon serveur :

➜ ansible-playbook -i hosts.yaml create-user.yaml -vv
ansible-playbook [core 2.11.1]
  config file = None
  configured module search path = ['/Users/citizix/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.9/site-packages/ansible
  ansible collection location = /Users/citizix/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible-playbook
  python version = 3.9.5 (default, May  4 2021, 03:36:27) [Clang 12.0.0 (clang-1200.0.32.29)]
  jinja version = 2.11.3
  libyaml = False
No config file found; using defaults
redirecting (type: modules) ansible.builtin.authorized_key to ansible.posix.authorized_key
Skipping callback 'default', as we already have a stdout callback.
Skipping callback 'minimal', as we already have a stdout callback.
Skipping callback 'oneline', as we already have a stdout callback.

PLAYBOOK: create-user.yaml *********************************************************************************************************************************************************************************
1 plays in create-user.yaml

PLAY [Create user on a linux server] ***********************************************************************************************************************************************************************
META: ran handlers

TASK [Create a login user] *********************************************************************************************************************************************************************************
task path: /Users/citizix/projects/ansible/create-user.yaml:9
changed: [remote-server] => {"ansible_facts": {"discovered_interpreter_python": "/usr/libexec/platform-python"}, "changed": true, "comment": "", "create_home": true, "group": 1000, "groups": "wheel", "home": "/home/rocky", "name": "rocky", "password": "NOT_LOGGING_PASSWORD", "shell": "/bin/bash", "state": "present", "system": false, "uid": 1000}

TASK [Add public key to authorized_keys] *******************************************************************************************************************************************************************
task path: /Users/citizix/projects/ansible/create-user.yaml:17
redirecting (type: modules) ansible.builtin.authorized_key to ansible.posix.authorized_key
changed: [remote-server] => {"changed": true, "comment": null, "exclusive": false, "follow": false, "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC6gM14zM0+L+ERQFVFYbHBAjtyghKKx/N+qsFXxrcJqVqsyn1lp/erPqg3g6WSu/bwiAB+E22RyG9icS7Td8ssWi9vDE73DHgC5NGLm4KeP2FospEFjY6v8XVjkwQZJ+8YyCfXJ4E5cm0FGKZREakDlYeaonTaIjxkXlsZB3Yl93+KZvZ0g1WiBOU6N6NWpEQVvxYccWK4+EuQiCryELL0o4dCNrwLaYOyv/NbSYQ09m3+mvN0VRnTzo7qSOqy1U6oCVA9bhd+tRyoUsUqp3Up8jdfzEGfWr/Pqskjtl8YXySPHLEROXX/Om4AyT62EQxcPMzedPJ6HGLHnlk4EO9cBLawymdWO7AlghujksVBu9S+alOkAmJkkPzeq76WOjCTmoNxlQmEDlucukiujfWKl4hACdNVtARptvuc5+4uMYA4j4Ql+XtQ964UQa4HiGiNpoiDegzDq9GMEsQW4W5frRuOIm4R7thYGatRBkNFw+uemE5HclF8LXOuPkShhFqpDPgI1oH99covroXggV8/ovEf9ZSoshNLMHX5kXWGAWF983Cn2N5RpmqN8rfcGVq6C93njExvHDfl7bHkhT10axOLV/V4vX4lSktWVV4//vq2wMQLi5F1l7ai8scA3eYeSaWnDaJj2jnz6V5JBOPIOH/3lf7qq4oquZhmuWq3w== citizix", "key_options": null, "keyfile": "/home/rocky/.ssh/authorized_keys", "manage_dir": true, "path": null, "state": "present", "user": "rocky", "validate_certs": true}

TASK [Deny root from logging in] ***************************************************************************************************************************************************************************
task path: /Users/citizix/projects/ansible/create-user.yaml:23
changed: [remote-server] => {"backup": "", "changed": true, "msg": "line replaced"}

TASK [Allow specific users to log in] **********************************************************************************************************************************************************************
task path: /Users/citizix/projects/ansible/create-user.yaml:30
changed: [remote-server] => {"backup": "", "changed": true, "msg": "line added"}

TASK [Add my pub key to authorized_keys] *******************************************************************************************************************************************************************
task path: /Users/citizix/projects/ansible/create-user.yaml:37
ok: [remote-server] => {"changed": false, "comment": null, "exclusive": false, "follow": false, "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC6gM14zM0+L+ERQFVFYbHBAjcsTGZKKx/N+qsFXxrcJqVqsyn1lp/erPqg3g6WSu/bwiAB+E22RyG9icS7Td8ssWi9vDE73DHgC5NGLm4KeP2FospEFjY6v8XVjkwQZJ+8YyCfXJ4E5cm0FGKZREakDlYeaonTaIjxkXlsZB3Yl93+KZvZ0g1WiBOU6N6NWpEQVvxYccWK4+EuQiCryELL0o4dCNrwLaYOyv/NbSYQ09m3+mvN0VRnTzo7qSOqy1U6oCVA9bhd+tRyoUsUqp3Up8jdfzEGfWr/Pqskjtl8YXySPHLEROXX/Om4AyT62EQxcPMzedPJ6HGLHnlk4EO9cBLawymdWO7AlghujksVBu9S+alOkAmJkkPzeq76WOjCTmoNxlQmEDlucukiujfWKl4hACdNVtARptvuc5+4uMYA4j4Ql+XtQ964UQa4HiGiNpoiDegzDq9GMEsQW4W5frRuOIm4R7thYGatRBkNFw+uemE5HclF8LXOuPkShhFqpDPgI1oH99covroXggV8/ovEf9ZSoshNLMHX5kXWGAWF983Cn2N5RpmqN8rfcGVq6C93njExvHDfl7bHkhT10axOLV/V4vX4lSktWVV4//vq2wMQLi5F1l7ai8scA3eYeSaWnDaJj2jnz6V5JBOPIOH/3lf7qq4oquZhmuWq3w== [email protected]", "key_options": null, "keyfile": "/home/rocky/.ssh/authorized_keys", "manage_dir": true, "path": null, "state": "present", "user": "rocky", "validate_certs": true}

TASK [Add rocky to sudoers file] ***************************************************************************************************************************************************************************
task path: /Users/citizix/projects/ansible/create-user.yaml:43
changed: [remote-server] => {"backup": "", "changed": true, "msg": "line replaced"}
META: ran handlers
META: ran handlers

PLAY RECAP *************************************************************************************************************************************************************************************************
remote-server              : ok=6    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Linux
  1. Comment créer plusieurs comptes d'utilisateurs sous Linux

  2. Comment créer un volume physique sous Linux en utilisant LVM

  3. Comment créer et supprimer un groupe d'utilisateurs sous Linux

  4. Comment créer manuellement un compte utilisateur Linux

  5. Comment créer un utilisateur sous Linux en utilisant Python

Comment créer un lien symbolique sous Linux à l'aide de la commande Ln

Comment créer des utilisateurs à l'aide de la commande Useradd sous Linux

Comment créer un utilisateur Sudo dans Ubuntu Linux

Comment changer d'utilisateur sous Linux

Comment créer un utilisateur sur Ubuntu Linux de plusieurs façons

Comment créer/ajouter des utilisateurs sous Linux