Files

9.6 KiB
Executable File

Ansible Playbook Guide

Ansible Playbooks are YAML files that automate server configuration, deployment, and management tasks. This guide covers the basics of running a playbook, key concepts, and provides example playbooks to help you get started.

Table of Contents


Running an Ansible Playbook

To run an Ansible playbook, use the following command:

ansible-playbook <playbook.yaml> -i <inventory-file.ini>
  • <playbook.yaml>: The path to your playbook file.
  • <inventory-file.ini>: The path to your inventory file (can be in INI or YAML format).

Example

ansible-playbook deploy_nginx.yaml -i inventory.ini

This command runs the deploy_nginx.yaml playbook on the hosts defined in inventory.ini.

Key Concepts

  • hosts: all: Specifies the target hosts from the inventory on which the playbook should run.
  • become: yes: Executes tasks with elevated privileges (sudo).
  • Handlers: Special tasks triggered by other tasks using the notify directive.
  • Variables: Dynamic values that can be reused across tasks and playbooks for flexibility and maintainability.

Example Playbooks

1. Simple APT Cache Update

This playbook updates the APT package cache on all specified hosts.

- name: Update APT Cache
  hosts: all
  become: yes
  tasks:
    - name: Update apt-cache
      ansible.builtin.apt:
        update_cache: yes

2. Update APT Cache and Install Nginx

This playbook updates the APT cache and installs the Nginx web server.

- name: Update APT Cache and Install Nginx
  hosts: all
  become: yes
  tasks:
    - name: Update apt-cache and install Nginx
      ansible.builtin.apt:
        name: nginx
        state: present
        update_cache: yes

3. Install Nginx and Copy Configuration File

This playbook installs Nginx and copies a custom configuration file from the Ansible control node to the target hosts.

- name: Install Nginx and Copy Configuration
  hosts: all
  become: yes
  tasks:
    - name: Update apt-cache and install Nginx
      ansible.builtin.apt:
        name: nginx
        state: present
        update_cache: yes
        
    - name: Copy Nginx configuration file
      ansible.builtin.copy:
        src: /root/ansible/nginx.conf
        dest: /etc/nginx/nginx.conf

4. Full Nginx Deployment: Install, Configure, and Restart

This playbook demonstrates a complete Nginx deployment, including installation, configuration, and restarting the service.

- name: Full Nginx Deployment
  hosts: all
  become: yes
  tasks:
    - name: Update apt-cache and install Nginx
      ansible.builtin.apt:
        name: nginx
        state: present
        update_cache: yes
        
    - name: Copy Nginx configuration file
      ansible.builtin.copy:
        src: /root/ansible/nginx.conf
        dest: /etc/nginx/nginx.conf
      notify: Restart Nginx

  handlers:
    - name: Restart Nginx
      ansible.builtin.service:
        name: nginx
        state: restarted

5. Show Debug Message

Use the debug module to display a message during playbook execution. This is useful for testing or providing feedback within your playbooks.

- name: Show Debug Message
  hosts: all
  tasks:
    - name: Display debug message
      ansible.builtin.debug:
        msg: "Test Message"

6. Use a Shell Command

Run a shell command and capture the output for further use within the playbook.

- name: Execute Shell Command
  hosts: all
  tasks:
    - name: Run a shell command
      ansible.builtin.shell:
        cmd: echo "Hello, Ansible!"
      register: shell_output

    - name: Display Shell Output
      ansible.builtin.debug:
        msg: "Output is: {{ shell_output.stdout }}"

7. Playbook with Conditional Statements

This playbook demonstrates using conditional statements to check if a file exists and take action based on the result.

- name: Check if File Exists
  hosts: all
  tasks:
    - name: Check if file exists
      ansible.builtin.shell:
        cmd: ls /path/to/file
      register: file_output
      ignore_errors: yes

    - name: File Exists
      ansible.builtin.debug:
        msg: "File exists"
      when: file_output.rc == 0

    - name: File Does Not Exist
      ansible.builtin.debug:
        msg: "File does not exist"
      when: file_output.rc != 0

8. Check File Existence Using the stat Module

A more reliable method to check if a file exists using the stat module.

- name: Check if File Exists
  hosts: all
  tasks:
    - name: Check if file exists
      ansible.builtin.stat:
        path: /path/to/file
      register: file_stat

    - name: File Exists
      ansible.builtin.debug:
        msg: "File exists"
      when: file_stat.stat.exists

    - name: File Does Not Exist
      ansible.builtin.debug:
        msg: "File does not exist"
      when: not file_stat.stat.exists

9. Standalone Nginx Installation

This playbook installs Nginx on both Debian-based and RedHat-based systems by detecting the operating system family.

- name: Install Nginx
  hosts: all
  become: yes
  tasks:
    - name: Install on Debian-based systems
      ansible.builtin.apt:
        name: nginx
        state: present
      when: ansible_facts['os_family'] == "Debian"

    - name: Install on RedHat-based systems
      ansible.builtin.yum:
        name: nginx
        state: present
      when: ansible_facts['os_family'] == "RedHat"

10. Create a User

This playbook checks if a user exists and creates the user if it does not.

- name: Manage User Account
  hosts: all
  become: yes
  tasks:
    - name: Check if user exists
      ansible.builtin.command:
        cmd: id new_user
      register: user_data
      ignore_errors: yes

    - name: Create user
      ansible.builtin.user:
        name: new_user
        state: present
      when: user_data.rc != 0

11. Install Multiple Packages

These examples show how to install multiple packages using either a loop or a list.

Using a Loop

- name: Install Multiple Packages with Loop
  hosts: all
  become: yes
  tasks:
    - name: Install packages
      ansible.builtin.apt:
        name: "{{ item }}"
        state: present
      loop:
        - vim
        - git
        - nginx

Using a List

- name: Install Multiple Packages as a List
  hosts: all
  become

: yes
  tasks:
    - name: Install packages
      ansible.builtin.apt:
        name: ["vim", "nginx", "git"]
        state: present

12. Create Multiple Users

This playbook creates multiple users with different groups.

- name: Create Multiple Users
  hosts: all
  become: yes
  tasks:
    - name: Create users
      ansible.builtin.user:
        name: "{{ item.name }}"
        group: "{{ item.group }}"
        state: "{{ item.state }}"
      loop:
        - { name: "radin", state: "present", group: "sudo" }
        - { name: "test", state: "present", group: "dev" }
        - { name: "test2", state: "present", group: "test_unit" }

13. Import Playbook Files

You can split your playbooks into smaller, manageable files and include them as needed.

- name: Nginx Setup
  import_playbook: nginx.yaml

- name: User Creation
  import_playbook: users.yaml

14. Remove resolv.conf

This playbook removes the resolv.conf file from all specified hosts.

- name: Remove resolv.conf
  hosts: all
  become: yes
  tasks:
    - name: Remove resolv.conf
      ansible.builtin.file:
        path: /etc/resolv.conf
        state: absent
      ignore_errors: true  # Ignore errors if the file does not exist

15. Enable SSH Login Banner

This playbook enables an SSH login banner by copying a banner file and updating the SSH configuration.

- name: Enable SSH Login Banner
  hosts: all
  become: yes
  tasks:
    - name: Copy Banner
      ansible.builtin.copy:
        src: "issue.net"
        dest: /etc/issue.net
      ignore_errors: true  # Ignore errors if the source file does not exist

    - name: Update SSHD Config File for Banner
      ansible.builtin.lineinfile:
        path: /etc/ssh/sshd_config
        regexp: '^Banner'
        line: 'Banner /etc/issue.net'

    - name: Restart SSH Service
      ansible.builtin.service:
        name: sshd
        state: restarted