- Home »

Как установить и настроить 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 отлично подходит для эволюционного подхода к автоматизации.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.