Files
my-docs/Configuration Management & Automation/Ansible/3-PlayBook.md

9.7 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.

give var in command line

ansible-playbook -i server.ini main.yaml -e "env=2"

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