Home » Как установить и настроить Ansible на последний CentOS
Как установить и настроить Ansible на последний CentOS

Как установить и настроить Ansible на последний CentOS

Если ты администрируешь несколько серверов или просто хочешь упростить себе жизнь, то рано или поздно придёшь к автоматизации рутинных задач. Ansible — это именно тот инструмент, который превратит твой хаос из скриптов в элегантную систему управления конфигурациями. Сегодня разберёмся, как поднять Ansible на свежем CentOS и настроить его для реальной работы. Никаких лишних слов — только практика и готовые решения.

## Что такое Ansible и зачем он нужен?

Ansible — это система управления конфигурациями, которая позволяет автоматизировать установку софта, настройку серверов и деплой приложений. Главная фишка в том, что он работает без агентов — достаточно SSH-доступа к целевым машинам. Написан на Python, использует YAML для описания задач (playbooks) и может управлять сотнями серверов одновременно.

Основные преимущества:

  • Простота освоения — YAML читается как обычный текст
  • Идемпотентность — можно запускать один playbook много раз без побочных эффектов
  • Агentless — не нужно устанавливать дополнительное ПО на управляемые хосты
  • Модульность — огромная библиотека готовых модулей

## Установка Ansible на CentOS

Для начала нужен сервер под управлением. Если у тебя ещё нет подходящего VPS, можешь взять здесь или для более серьёзных задач рассмотреть выделенный сервер.

### Способ 1: Через EPEL репозиторий (рекомендуется)

# Обновляем систему
sudo dnf update -y

# Устанавливаем EPEL репозиторий
sudo dnf install epel-release -y

# Устанавливаем Ansible
sudo dnf install ansible -y

# Проверяем установку
ansible --version

### Способ 2: Через pip (для свежих версий)

# Устанавливаем Python и pip
sudo dnf install python3 python3-pip -y

# Устанавливаем Ansible через pip
pip3 install ansible

# Добавляем в PATH (если нужно)
echo 'export PATH=$PATH:/home/$(whoami)/.local/bin' >> ~/.bashrc
source ~/.bashrc

### Способ 3: Через официальный репозиторий

# Добавляем официальный репозиторий
sudo subscription-manager repos --enable ansible-2.9-for-rhel-8-x86_64-rpms

# Устанавливаем Ansible
sudo dnf install ansible -y

## Первоначальная настройка

### Создание структуры проекта

# Создаём рабочую директорию
mkdir ~/ansible-project
cd ~/ansible-project

# Создаём базовую структуру
mkdir -p {playbooks,roles,inventory,group_vars,host_vars}

# Создаём конфигурационный файл
touch ansible.cfg

### Настройка ansible.cfg

[defaults]
inventory = ./inventory/hosts
host_key_checking = False
timeout = 30
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_fact_cache
fact_caching_timeout = 86400
remote_user = root
private_key_file = ~/.ssh/id_rsa

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
pipelining = True

### Создание файла инвентаря

# Создаём inventory/hosts
[webservers]
web1.example.com ansible_host=192.168.1.10
web2.example.com ansible_host=192.168.1.11

[databases]
db1.example.com ansible_host=192.168.1.20
db2.example.com ansible_host=192.168.1.21

[production:children]
webservers
databases

[production:vars]
ansible_user=root
ansible_ssh_private_key_file=~/.ssh/id_rsa

## Настройка SSH-ключей

Для безопасной работы без паролей настроим SSH-ключи:

# Генерируем SSH-ключ (если ещё нет)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# Копируем ключ на целевые серверы
ssh-copy-id root@192.168.1.10
ssh-copy-id root@192.168.1.11
ssh-copy-id root@192.168.1.20

# Проверяем доступность хостов
ansible all -m ping

## Первые команды и проверка работы

### Ad-hoc команды

# Проверяем доступность всех хостов
ansible all -m ping

# Проверяем uptime
ansible all -m command -a "uptime"

# Собираем информацию о системе
ansible all -m setup

# Устанавливаем пакет на все веб-серверы
ansible webservers -m dnf -a "name=htop state=present"

# Перезапускаем сервис
ansible webservers -m systemd -a "name=httpd state=restarted"

### Создание первого playbook

# playbooks/basic-setup.yml
---
- name: Basic server setup
  hosts: all
  become: yes
  
  tasks:
    - name: Update all packages
      dnf:
        name: "*"
        state: latest
        
    - name: Install essential packages
      dnf:
        name:
          - htop
          - vim
          - wget
          - curl
          - git
        state: present
        
    - name: Create admin user
      user:
        name: admin
        groups: wheel
        shell: /bin/bash
        create_home: yes
        
    - name: Configure SSH
      lineinfile:
        path: /etc/ssh/sshd_config
        regexp: "^PasswordAuthentication"
        line: "PasswordAuthentication no"
        backup: yes
      notify: restart sshd
      
  handlers:
    - name: restart sshd
      systemd:
        name: sshd
        state: restarted

### Запуск playbook

# Проверяем синтаксис
ansible-playbook playbooks/basic-setup.yml --syntax-check

# Запускаем в режиме проверки (dry-run)
ansible-playbook playbooks/basic-setup.yml --check

# Запускаем реальное выполнение
ansible-playbook playbooks/basic-setup.yml

# Запускаем только для конкретной группы
ansible-playbook playbooks/basic-setup.yml --limit webservers

## Полезные практические примеры

### Настройка веб-сервера

# playbooks/webserver-setup.yml
---
- name: Configure web server
  hosts: webservers
  become: yes
  
  vars:
    document_root: /var/www/html
    
  tasks:
    - name: Install Apache
      dnf:
        name: httpd
        state: present
        
    - name: Start and enable Apache
      systemd:
        name: httpd
        state: started
        enabled: yes
        
    - name: Configure firewall
      firewalld:
        service: http
        permanent: yes
        state: enabled
        immediate: yes
        
    - name: Deploy website
      template:
        src: index.html.j2
        dest: "{{ document_root }}/index.html"
        owner: apache
        group: apache
        mode: '0644'
      notify: restart httpd
      
  handlers:
    - name: restart httpd
      systemd:
        name: httpd
        state: restarted

### Автоматическое обновление системы

# playbooks/system-update.yml
---
- name: System maintenance
  hosts: all
  become: yes
  
  tasks:
    - name: Update package cache
      dnf:
        update_cache: yes
        
    - name: Upgrade all packages
      dnf:
        name: "*"
        state: latest
      register: upgrade_result
      
    - name: Check if reboot is needed
      stat:
        path: /var/run/reboot-required
      register: reboot_required
      
    - name: Reboot if needed
      reboot:
        reboot_timeout: 600
      when: reboot_required.stat.exists
      
    - name: Clean package cache
      dnf:
        autoremove: yes
        
    - name: Send notification
      debug:
        msg: "System updated successfully on {{ inventory_hostname }}"

## Работа с ролями

### Создание роли

# Создаём структуру роли
ansible-galaxy init roles/nginx

# Структура роли
roles/nginx/
├── tasks/
│   └── main.yml
├── handlers/
│   └── main.yml
├── templates/
├── files/
├── vars/
│   └── main.yml
├── defaults/
│   └── main.yml
└── meta/
    └── main.yml

### Пример роли для Nginx

# roles/nginx/tasks/main.yml
---
- name: Install Nginx
  dnf:
    name: nginx
    state: present
    
- name: Start and enable Nginx
  systemd:
    name: nginx
    state: started
    enabled: yes
    
- name: Configure Nginx
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
    backup: yes
  notify: restart nginx
  
- name: Configure firewall for Nginx
  firewalld:
    service: "{{ item }}"
    permanent: yes
    state: enabled
    immediate: yes
  loop:
    - http
    - https

## Сравнение с другими решениями

Инструмент Архитектура Сложность Производительность Сообщество
Ansible Agentless Низкая Средняя Очень активное
Puppet Master-Agent Высокая Высокая Активное
Chef Master-Agent Высокая Высокая Активное
SaltStack Master-Minion Средняя Очень высокая Активное

## Практические кейсы использования

### Плюсы и минусы в реальной работе

**Положительные моменты:**

  • Быстрое развёртывание стандартных конфигураций
  • Идемпотентность позволяет безопасно перезапускать playbook’и
  • Отличная интеграция с облачными провайдерами
  • Простота отката изменений

**Подводные камни:**

  • Производительность падает при работе с тысячами хостов
  • Отладка сложных playbook’ов может быть болезненной
  • Нет встроенной системы мониторинга состояния
  • Зависимость от SSH может стать узким местом

### Интересные факты и нестандартные применения

Ansible может не только настраивать серверы, но и:

  • Управлять сетевым оборудованием — есть модули для Cisco, Juniper, HP
  • Работать с Docker и Kubernetes — полноценная поддержка контейнеров
  • Автоматизировать тестирование — можно создавать тестовые окружения
  • Интегрироваться с облаками — AWS, Azure, GCP из коробки

## Продвинутые возможности

### Использование Ansible Vault

# Шифруем секреты
ansible-vault create group_vars/production/secrets.yml

# Редактируем зашифрованный файл
ansible-vault edit group_vars/production/secrets.yml

# Запускаем playbook с расшифровкой
ansible-playbook playbooks/deploy.yml --ask-vault-pass

# Или с файлом пароля
ansible-playbook playbooks/deploy.yml --vault-password-file ~/.vault_pass

### Динамический инвентарь

# inventory/ec2.py (пример для AWS)
#!/usr/bin/env python3
import boto3
import json

def get_inventory():
    ec2 = boto3.client('ec2')
    response = ec2.describe_instances()
    
    inventory = {
        'webservers': {
            'hosts': [],
            'vars': {}
        },
        '_meta': {
            'hostvars': {}
        }
    }
    
    for reservation in response['Reservations']:
        for instance in reservation['Instances']:
            if instance['State']['Name'] == 'running':
                inventory['webservers']['hosts'].append(instance['PublicIpAddress'])
                
    return inventory

if __name__ == '__main__':
    print(json.dumps(get_inventory(), indent=2))

### Callback плагины для мониторинга

# ansible.cfg
[defaults]
callback_plugins = ./callback_plugins
stdout_callback = json
bin_ansible_callbacks = True

# Можно настроить отправку результатов в:
# - Slack
# - Email
- Logstash
- Datadog

## Полезные ссылки

## Заключение и рекомендации

Ansible — это мощный инструмент, который действительно упрощает жизнь системного администратора. Начинай с простых задач: установка пакетов, настройка пользователей, обновление систем. Постепенно переходи к более сложным сценариям с ролями и динамическим инвентарём.

Когда использовать Ansible:

  • Управление небольшими и средними парками серверов (до 1000 хостов)
  • Автоматизация деплоя приложений
  • Стандартизация конфигураций
  • Быстрое прототипирование автоматизации

Когда стоит рассмотреть альтернативы:

  • Очень большие парки серверов (более 5000 хостов)
  • Необходимость real-time мониторинга состояния
  • Сложные workflow с множеством зависимостей
  • Высокие требования к производительности

Главное — не пытайся автоматизировать всё сразу. Начни с того, что делаешь чаще всего, и постепенно расширяй функциональность. Ansible отлично подходит для эволюционного подхода к автоматизации.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

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