Files
my-docs/Ansible/Document.md
2024-08-30 13:25:13 +03:30

5.0 KiB

Ansible Configuration Guide

Ansible is a powerful automation tool used to manage and configure servers. This guide provides examples of how to structure your inventory files, essential for defining the servers and groups that Ansible will manage. Additionally, it covers common Ansible commands for interacting with your servers.

Inventory File Examples

INI Format

The INI format is one of the simplest ways to define your inventory. Below are two examples showcasing different use cases.

Example 1: Single Group Inventory

In this example, all servers are grouped under a single [all] group. Each server is defined with specific connection details:

[all]
<server-name> ansible_host=<server-ip> ansible_ssh_pass=<password> ansible_port=<ssh-port> ansible_connection=<connection-type>
  • <server-name>: A label or hostname for your server.
  • <server-ip>: The IP address of the server.
  • ansible_ssh_pass: The SSH password for connecting to the server.
  • ansible_port: The port used for SSH connections.
  • ansible_connection: The connection type (e.g., ssh, winrm).

Example 2: Grouped Inventory with Variables

This example demonstrates grouping servers by roles (e.g., web, db, bk). Group-specific variables are defined under [all:vars]:

[all]
<server1-name> ansible_host=<server1-ip>
<server2-name> ansible_host=<server2-ip>
<server3-name> ansible_host=<server3-ip>

[web]
<server1-name>

[db]
<server2-name>

[bk]
<server3-name>

[all:vars]
ansible_user=<username>
ansible_port=<ssh-port>
  • Groups: Servers are organized into different groups (web, db, bk).
  • [all:vars]: Common variables for all groups.

YAML Format

The YAML format provides a more structured and readable way to define your inventory, especially useful for larger or more complex environments.

Example: Grouped Inventory with Host-Specific Variables

This example illustrates how to define an inventory with nested groups and host-specific variables:

all:
  children:
    webservers:
      hosts:
        192.168.1.100:
          ansible_port: 22
        192.168.1.110:
          ansible_port: 1357
      vars:
        http_port: 8080
    dbserver:
      hosts:
        db.main.local:
          db_user: admin
          db_pass: secret
  • children: Groups within the all group, such as webservers and dbserver.
  • hosts: List of servers under each group, with their specific variables.
  • vars: Group-specific variables, such as http_port for webservers.

Common Ansible Commands

Below are some frequently used Ansible commands for managing your servers.

Listing Hosts

List all hosts defined in the inventory file:

ansible --list-hosts all -i servers.ini
# or for YAML format
ansible --list-hosts all -i servers.yaml

Ping All Servers

Check the connectivity of all servers:

ansible -m ping all -i server.ini

Execute Commands

Run a command (e.g., uptime) on all servers:

ansible -m command -a "uptime" all -i server.ini

Copy Files to Servers

Copy a file from the Ansible server to all target servers:

ansible -m copy -a "src=<file-location-on-ansible-server> dest=<destination-location-on-server>" all -i server.ini

Run Commands with Sudo

Execute a command with elevated privileges (sudo) as the root user:

ansible -m command -a "uptime" all -i server.ini --become --become-user root --become-method sudo 

Install a Package

Install the nginx package on all servers:

ansible -m apt -a "name=nginx state=present" --become --become-user root --become-method sudo

Uninstall a Package

Remove the nginx package from all servers:

ansible -m apt -a "name=nginx state=absent" --become --become-user root --become-method sudo

Update and Upgrade Packages

Update the package list and upgrade all packages:

ansible -m apt -a "upgrade=yes update_cache=yes" --become --become-user root --become-method sudo

Advanced Usage and Notes

Special Considerations

  • Module Limitations: The command module does not support special characters or shell features. For commands requiring shell features (like pipes or redirection), use the shell module.

    Example:

    ansible -m shell -a "cat /etc/passwd | grep -l" all -i server.ini --become
    
  • Raw Module: Use the raw module for devices that do not have Python installed. It allows you to execute raw SSH commands directly.

    Example:

    ansible -m raw -a "hostnamectl" all -i server.ini --become
    

Gathering System Facts

Use the setup module to gather system facts from all servers:

ansible -m setup --become all -i server.ini

You can filter specific facts:

ansible -m setup -a "filter=ansible_memory" --become all -i server.ini
ansible -m setup -a "filter=ansible_distribution" --become all -i server.ini

Installing Ansible Galaxy Collections

To install the ansible.posix collection, use:

ansible-galaxy collection install ansible.posix