Adding User and Password Using Ansible

Adding User and Password Using Ansible

27.05.2024
Author: HostZealot Team
2 min.
166

Users are offered lots of tools and features for automation purposes and that greatly simplifies all the challenges that can be connected with management. Here, we will introduce you to a great tool that is called Ansible. This is a fantastic option for adding new users and passwords. If you have a couple of servers, then the manual process of adding new users can be really time-consuming. Now, you don’t need to waste time and enter all the users, you can automate this process.

Based on our practical experience with tool exploitation, we will share a couple of insights about Ansible.   

Environment Preparation

Environment preparation is a crucial step in any process, that is why try to check that everything you need is there:

  • Inventory file with hosts
  • Ansible is installed on the controller node
  • SSH connection between client and control nodes is available
  • Client node as remote one

The user Module

This type of module in Ansible is essential for the user management processes on the hosts. Here are a couple of options that are provided by a user mode:

  • State – determines the necessary state of the account
  • Home – this specifies the home directory
  • Shell – login shell
  • Password – the user’s password
  • Groups – supplementary groups
  • Ssh_key_file – a place where the SSH key is stored
  • Ssh_key_bits – specification of bits’ number in the key
  • Name – and let’s not forget about a required user’s name

Of course, these are only the basic options, but the variety is huge and several additional ones for this module are:

  • Profile – specification of the profile
  • Seuser – this option adds the security context
  • Update_password – this criterion is needed for the update purpose

User Creation Process

If speaking specifically about the process of user creation, there are technically 2 options. So, let’s discuss each variant in detail.  

User Insertion via Ad-Hoc Commands

The first option for the user creation relates to the Ad-Hoc commands. Let’s dive into a real sample of the user creation process:

$ ansible -i project_inventory.ini client1 -m user -a "name=Action state=present createhome=yes" -b
192.168.221.171 | CHANGED => {
"ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 1006,
"home": "/home/action",
"name": "Action",
"shell": "/bin/sh",
"state": "present",
"system": false,
"uid": 1005
}

To check whether the user was created with all the mentioned details, use the following command:

$ ls /home

User Insertion via Playbooks

The user creation process via playbooks starts with:

$ cat add_user.yml
---
- name: Create a user
  hosts: client1
  become: yes
  tasks:
  - name: Add user Action
user:
  name: Action
  shell: /bin/bash
  home: /home/action

After that run this playbook. To check whether the process was successful, as in the previous example switch to the client node and use the same command:

$ ls /home/

Group Membership Establishment

Now we will proceed to the establishment of the group membership for already created user, the process is the following:

$ cat add_grp.yml
---
- name: Create a group and add a user
  hosts: client1
  become: yes
  tasks:
- name: Ensure the group exists
  group:
    name: group1
    state: present
- name: Add user to the group
  user:
    name: action
    groups: group1
    append: yes

After that run this playbook. To check whether the process has completed successfully use the following command:

$ groups group1 

Password Integration

Here we will share a couple of methods to integrate a password in a proper way.

Password Generation with mkpasswd

Encrypted passwords can be created with various methods, but mkpasswd is considered to be the most frequent one. This utility is in the whois pack, so let’s start with an installation:

$ sudo apt install whois

Password Insertion via Ad-Hoc Commands

Mkpasswd can be used together with Ad-Hoc in such a way:

$ ansible -i project_inventory.ini client1 -m user -a "name=Action password=$(mkpasswd --method=sha-512 '123')" --become
192.168.221.171 | CHANGED => {
"ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
},
"append": false,
"changed": true,
"comment": "",
"group": 1006,
"home": "/home/action",
"move_home": false,
"name": "Action",
"password": "NOT_LOGGING_PASSWORD",
"shell": "/bin/sh",
"state": "present",
"uid": 1005
}

For the verification of the password, try to log in with the new one to the user.

Password Insertion via Playbooks

For the insertion via playbook, use the next line:

mkpasswd --method=sha-512
Password:
$6$r6pnvoHc$gpG9kpqIbQfGL2o/NsTD/uN04OsZ15zAydVFPYkflnbSWCTTUBn9yC6IJb7MoRvzQqmadKuf.GEYv8ldQrlZO1

After that, you can insert the password in the playbook and run it. Then you can try to enter with the created password.

Remote Access Configuration

With the help of Ansible, we can also use passwordless access. For this remote access start with the creation of the playbook:

$ cat user_ssh.yml
---
- name: Create user, SSH directory, and transfer SSH keys
  hosts: client1
  become: yes  # Use become to run tasks as a privileged user
  tasks:
- name: Create SSH directory for action
  file:
    path: /home/action/.ssh
    state: directory
    owner: action
    group: action
    mode: 0700
- name: Generate SSH key for action
  user:
    name: action
    generate_ssh_key: yes
    ssh_key_type: rsa
    ssh_key_bits: 4096
    ssh_key_file: /home/action/.ssh/id_rsa  # Full path is needed here
- name: Transfer public key to the target host
  authorized_key:
    user: action
    key: "lookup('file', '/home/vagrant/.ssh/id_rsa.pub')"

To Sum Up

In this article, we shared the common samples of Ansible usage starting from creating a user and ending with passwordless usage. Hope this information was helpful for you!

Related Articles