Change Root Password using Ansible

Change root password using Ansible

In this article, we will review step-by-step, how to change the root password using Ansible. As part of this process, we will examine a sample playbook to gain a better understanding.

Table of Contents

Introduction

In the ever-evolving landscape of IT infrastructure management, automation has become an indispensable tool. Among the myriad of automation tools available, Ansible stands out for its simplicity, scalability, and agentless architecture. Originally developed by Michael DeHaan in 2012, Ansible has quickly gained popularity in the DevOps community as a powerful and easy-to-use configuration management and automation tool.

Change root password using Ansible

Photo by unlisted from hub.tie.org

Change Root Password using Ansible: A Step-by-Step Guide:

To change the root password using Ansible, you’ll need to create a playbook that leverages Ansible’s rich set of modules. Here’s a sample playbook to guide you through the process:

				
					---
- name: Cycle root password and store it using ansible-vault
  hosts: all
  become: false
 
  # Generate and store root password in password file (secret.yaml)
  vars:
    rootPass: "{{ lookup('password', '{{ passwdDir }}/secret.yaml chars=ascii_letters,digits,punctuation') }}"
    newPass: "{{ lookup('password', '{{ passwdDir }}/secret1.yaml chars=ascii_letters,digits,punctuation') }}"
    passwdDir: ~/.secret-yaml-files
    vaultPass: ~/.vault_key
    runningfromHost: localhost

  tasks:
  # Check if password file exists
  - name: Check if secret.yaml file exists
    stat:
      path: "{{ passwdDir }}/secret.yaml"
    register: stat_secrets
 
  # Encrypt password file
  - name: Encrypt password file using ansible-vault on {{ runningfromHost }}    
    shell: ansible-vault encrypt {{ passwdDir }}/secret.yaml --vault-password-file {{ vaultPass }}
    when:
      - stat_secrets.stat.exists|bool == true
    run_once: true
    delegate_to: "{{ runningfromHost }}"

  # View decrypted password file
  - name: Allow temporary password file decryption for password hashing on {{ runningfromHost }}
    shell: ansible-vault view {{ passwdDir }}/secret.yaml --vault-password-file {{ vaultPass }} > {{ passwdDir }}/secret1.yaml
    when:
      - stat_secrets.stat.exists|bool == true
    run_once: true
    delegate_to: "{{ runningfromHost }}"

  # Update root password hash
  - name: Update root password hash
    user:
      name: root
      #update_password: always
      password: "{{ newPass | password_hash('sha512') }}"
    become: yes
 
  - debug:
      msg: "{{ newPass }}"
           
  # Get Timestamp from the OS
  - name: Get timestamp from the system
    shell: "date +%Y-%m-%d-%H.%M.%S"
    register: tstamp
    run_once: true
    delegate_to: "{{ runningfromHost }}"

  # Backup the password file
  - name: Save password file to backup using timestamp
    command: mv {{ passwdDir }}/secret.yaml {{ passwdDir }}/secret.yaml-{{ tstamp.stdout }}      
    when:
      - stat_secrets.stat.exists|bool == true
    run_once: true
    delegate_to: "{{ runningfromHost }}"

  # Clean up the password dir contents
  - name: Clean up the contents of the password file directory
    file:
      state: absent
      path: "{{ passwdDir }}/secret1.yaml"
    run_once: true
				
			

Explanation of Each Step

Now, let’s break down each line of the Ansible playbook (above):

Playbook Header

    • ---: YAML document start indicator.
    • - name: Cycle root password and store it using ansible-vault: A named section describing the purpose of the playbook.
    • hosts: all: The playbook applies to all hosts.
    • become: false: Disables privilege escalation.

Variable Definitions

    • vars: Defines variables used in the playbook.
    • rootPass: Generates a random root password using the lookup function.
    • newPass: Generates a new random password for root.
    • passwdDir: Specifies the directory for password files.
    • vaultPass: Specifies the path to the Ansible Vault key file.
    • runningfromHost: Defines the localhost as the host running the playbook.

Tasks Section

    • tasks: The list of tasks to be executed.
    • name: Check if secret.yaml file exists: Uses the stat module to check if the password file exists.
    • name: Encrypt password file using ansible-vault on {{ runningfromHost }}: Encrypts the password file using Ansible Vault.
    • name: Allow temporary password file decryption for password hashing on {{ runningfromHost }}: Temporarily decrypts the password file to update the root password hash.
    • name: Update root password hash: Uses the user module to update the root password hash.
    • name: Get timestamp from the system: Retrieves the current timestamp.
    • name: Save password file to backup using timestamp: Creates a backup of the password file with a timestamp.
    • name: Clean up the contents of the password file directory: Removes the temporary decrypted password file.

Best Practices

  1. Encrypt Sensitive Data: Avoid hardcoding sensitive information like passwords directly into playbooks. Use Ansible Vault to encrypt sensitive data securely.

  2. Limit Privilege Escalation: Only use become where necessary. Limit privilege escalation to specific tasks rather than the entire playbook.

  3. Version Control: Store your playbooks in a version control system like Git to track changes and collaborate effectively.

  4. Documentation: Include comments and documentation within your playbooks to make them more understandable and maintainable.

  5. Testing: Before deploying playbooks in a production environment, thoroughly test them in a controlled environment to avoid unintended consequences.

Conclusion

Ansible provides a powerful and efficient solution for automating various IT tasks, including the management of root passwords. By following best practices and utilizing Ansible’s capabilities, you can enhance security, streamline processes, and ensure consistent configuration across your infrastructure. Happy automating!

Related Posts

secure SSH with Ansible
HOWTO
Secure SSH with Ansible

Learn how to secure SSH with Ansible and protect your Linux systems from unauthorized access with this step-by-step guide. Table of Contents Introduction Ansible is

Read More »

Leave a Reply

Your email address will not be published. Required fields are marked *