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
- Ansible Playbook Guide
- Table of Contents
- Running an Ansible Playbook
- Key Concepts
- Example Playbooks
- 1. Simple APT Cache Update
- 2. Update APT Cache and Install Nginx
- 3. Install Nginx and Copy Configuration File
- 4. Full Nginx Deployment: Install, Configure, and Restart
- 5. Show Debug Message
- 6. Use a Shell Command
- 7. Playbook with Conditional Statements
- 8. Check File Existence Using the
statModule - 9. Standalone Nginx Installation
- 10. Create a User
- 11. Install Multiple Packages
- 12. Create Multiple Users
- 13. Import Playbook Files
- 14. Remove
resolv.conf - 15. Enable SSH Login Banner
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
notifydirective. - 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