Backend
October 11, 2023

Автоматизация с Ansible: основы настройки и управления

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

Ansible - это программа, которая позволяет настраивать и управлять множеством компьютеров из одного места.

Представь, что у тебя дома стоит 5 компьютеров. Чтобы установить на них какое-то ПО или изменить настройки, придется подходить к каждому и делать всё вручную. А с Ansible достаточно отдать одну команду - и он всё сделает сам на всех компьютерах!

Кроме установки ПО, с помощью Ansible можно deploy'ить (развернуть) web-приложения, настроить сеть, обновить системы и многое другое.

Ansible работает по принципу оркестровщика - он как дирижер в оркестре, управляет процессами на всех компьютерах из одного центра.

По сути, Ansible автоматизирует рутинные задачи по администрированию и экономит кучу времени. Поэтому знание Ansible - важный навык для сисадминов и девопсов.

Установка Ansible

Чтобы использовать Ansible, нужно установить его на компьютер, с которого будет осуществляться управление.

Установка на Linux:

sudo apt update
sudo apt install ansible

На MacOS с помощью Homebrew:

brew install ansible

На Windows можно установить Ansible в WSL или с помощью pip.

После установки проверяем:

ansible --version

Должна вывестись информация о версии. Значит, Ansible работает!

Первые шаги в Ansible

Перед началом работы в Ansible нужно определить список управляемых хостов (компьютеров). Это делается в файле inventory (инвентаризации).

Например, у нас есть:

  • Компьютеры web1, web2 - с установленным веб-сервером nginx.
  • Компы db1, db2 - с СУБД PostgreSQL.
  • Компы net1, net2 - маршрутизаторы.

Тогда в inventory прописываем:

[webservers]
web1
web2

[dbservers] 
db1
db2

[netservers]
net1 
net2

Теперь Ansible знает все управляемые хосты и можно писать playbook (плейбук) - набор инструкций для настройки систем.

Например, плейбук для установки nginx на веб-серверах:

- hosts: webservers
  tasks:
   - name: Install nginx
     apt:
      name: nginx
      state: latest

Запускаем:

ansible-playbook playbook.yml

Ansible соединится с хостами web1 и web2 и установит на них nginx!

Модули в Ansible

Всю работу в Ansible выполняют модули - готовые "куски кода" для конкретных задач.

Основные модули:

  • command - выполнить команду в системе
  • shell - запустить shell команды
  • git - работа с git
  • file - управление файлами
  • template - работа с шаблонами файлов

Например, модуль command:

- name: Install Figlet
  command: apt install figlet

Установит figlet на хостах.

Или модуль git:

- name: Clone repository
  git:
    repo: https://github.com/user/repo.git
    dest: /home/user/repo

Склонирует указанный репозиторий git.

Таких модулей огромное количество, для любой задачи есть готовое решение.

Переменные и шаблоны

Часто нужно, чтобы плейбуки были более гибкими. Для этого используют переменные.

Например, установим nginx, используя переменные:

- hosts: webservers

  vars:
    nginx_version: 1.14

  tasks:
  - name: Install nginx version {{ nginx_version }}
    apt:
     name: nginx={{ nginx_version }}

При запуске Ansible подставит значение вместо {{ nginx_version }}.

Шаблоны позволяют генерировать файлы с нужным содержимым.

Например, шаблон index.html.j2:

<html>
<title>Website</title>
<body>
{{ custom_text }}
</body>
</html>

А в плейбуке передаем переменную custom_text, чтобы подставить нужный текст.

Группы хостов и управление

В больших инфраструктурах хосты объединяют в группы - например, группа веб-серверов, группа баз данных.

Это позволяет выполнять playbook только для нужной группы:

- hosts: webservers
  tasks:
   - command: echo 'This will run on webservers'
   
- hosts: dbservers
  tasks:
   - command: echo 'This will run on dbservers'

Также можно использовать теги.

Например:

- hosts: webservers
  tags:
   - nginx

  tasks:
   - name: Install Nginx
     apt:
      name: nginx
- hosts: dbservers  
  tags:
   - postgres
  
  tasks:
   - name: Install Postgres
     apt:
       name: postgresql

И выполнить:

ansible-playbook playbook.yml --tags nginx

Запустится только таск с тегом nginx. Теги позволяют выборочно запускать части playbook.

Деплой веб-приложений

Одна из распространенных задач - развертывание веб-приложений на серверах.

Допустим, есть Git репозиторий с кодом приложения.

Тогда плейбук может выглядеть так:

- hosts: webservers

  tasks:
  - name: Clone repository 
    git:
     repo: https://github.com/user/webapp.git
     dest: /var/www/webapp
  
  - name: Install dependencies
    command: npm install
    cwd: /var/www/webapp
  
  - name: Start application
    command: npm start
    cwd: /var/www/webapp

Этот playbook:

  1. Склонирует репозиторий в /var/www/webapp
  2. В папке приложения выполнит установку зависимостей
  3. Запустит приложение командой npm start

Таким образом можно легко автоматизировать разворачивание веб-приложений на серверах!

Обновление систем с Ansible

Еще один распространенный случай - автоматизация обновлений ПО и систем.

Например, плейбук для обновления Ubuntu:

- hosts: all

  tasks:
  - name: Update repositories cache
    apt:
      update_cache: yes
  - name: Upgrade all packages
    apt:
      upgrade: dist
  - name: Remove unused packages
    apt:
      autoremove: yes

Он обновит репозитории, выполнит обновление пакетов и удалит ненужные пакеты.

Также можно перезагружать сервисы, перезагружать систему и выполнять другие действия после обновлений.

Заключение

Примерно так Ansible помогает автоматизировать администрирование и экономит много времени. Я рассказал про основные возможности и показал примеры плейбуков для разных задач.

Надеюсь, тебе было интересно и понятно!