TimVin

1. Основные понятия

Ansible — инструмент для автоматизации настройки и управления удалёнными узлами (серверами, контейнерами и т. д.). Работает по SSH без агентов на целевых узлах.

Ключевые компоненты:

  • Inventory — файл со списком управляемых хостов.

  • Playbook — YAML‑файл с описанием задач для выполнения.

  • Task — отдельная операция (например, установка пакета).

  • Module — встроенный «исполнитель» задач (например, apt, yum, copy).

  • Role — набор плейбуков, переменных и файлов для решения типовой задачи.

  • Variable — переменная для параметризации плейбуков.

2. Установка и настройка

Установка (Ubuntu/Debian):

bash
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible

Проверка версии:

bash
ansible --version

3. Inventory (файл хостов)

Пример inventory.ini:

ini
[webservers]
web1.example.com
web2.example.com ansible_user=deploy

[dbservers]
db1.example.com ansible_port=2222

[all:vars]
ansible_connection=ssh
ansible_user=root

Запуск команды на группе хостов:

bash
ansible webservers -i inventory.ini -m ping

4. Playbook (основной синтаксис)

Структура YAML:

yaml
---
- name: My first playbook
  hosts: webservers
  become: yes  # sudo
  tasks:
    - name: Ensure nginx is installed
      apt:
        name: nginx
        state: present
    - name: Start nginx
      service:
        name: nginx
        state: started

Запуск плейбука:

bash
ansible-playbook -i inventory.ini playbook.yml

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

  1. apt / yum — управление пакетами:

    yaml
    - name: Install Apache
      apt:
        name: apache2
        state: present
    
  2. copy — копирование файлов:

    yaml
    - name: Copy config file
      copy:
        src: /local/path/config.conf
        dest: /etc/app/config.conf
        owner: root
        group: root
        mode: '0644'
    
  3. file — управление файлами/директориями:

    yaml
    - name: Create directory
      file:
        path: /var/log/myapp
        state: directory
        mode: '0755'
    
  4. service — управление сервисами:

    yaml
    - name: Restart nginx
      service:
        name: nginx
        state: restarted
    
  5. shell / command — выполнение команд:

    yaml
    - name: Run custom script
      shell: /usr/local/bin/backup.sh
      args:
        chdir: /opt/backup
    
  6. git — клонирование репозиториев:

    yaml
    - name: Clone repo
      git:
        repo: https://github.com/user/repo.git
        dest: /opt/app
        version: main
    

6. Переменные

Определение в плейбуке:

yaml
vars:
  package_name: nginx
  config_path: /etc/nginx/nginx.conf

Использование:

yaml
- name: Install package
  apt:
    name: "{{ package_name }}"
    state: present

Внешние переменные (файл vars.yml):

yaml
---
nginx_version: 1.18
log_dir: /var/log/nginx

Подключение:

yaml
- name: Play with external vars
  hosts: all
  vars_files:
    - vars.yml
  tasks: ...

7. Условия и циклы

Условия (when):

yaml
- name: Install htop on Ubuntu
  apt:
    name: htop
    state: present
  when: ansible_os_family == "Debian"

Циклы (loop):

yaml
- name: Create users
  user:
    name: "{{ item }}"
    state: present
  loop:
    - alice
    - bob
    - charlie

8. Роли (Roles)

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

bash
ansible-galaxy init myrole

Структура роли:

roles/myrole/
├── tasks/
│   └── main.yml
├── handlers/
│   └── main.yml
├── templates/
│   └── config.j2
└── defaults/
    └── main.yml

Использование роли в плейбуке:

yaml
- name: Use myrole
  hosts: all
  roles:
    - myrole

9. Шаблонизация (Jinja2)

Пример шаблона config.j2:

jinja2
server {
    listen {{ http_port }};
    server_name {{ domain_name }};
    root {{ web_root }};
}

Использование в задаче:

yaml
- name: Deploy config
  template:
    src: config.j2
    dest: /etc/nginx/sites-available/default

10. Полезные команды

  • Проверка синтаксиса:

    bash
    ansible-playbook --syntax-check playbook.yml
    
  • Пробный запуск (не выполняет действия):

    bash
    ansible-playbook --check playbook.yml
    
  • Запуск отдельной задачи:

    bash
    ansible-playbook playbook.yml --step
    
  • Ограничение по тегам:

    bash
    ansible-playbook playbook.yml --tags "installation,config"
    
  • Просмотр фактов о хостах:

    bash
    ansible all -i inventory.ini -m setup
    

11. Лучшие практики

  1. Используйте роли для модульности.

  2. Храните секреты в Ansible Vault.

  3. Пишите комментарии к задачам.

  4. Тестируйте плейбуки с --check.

  5. Используйте теги для выборочного выполнения задач.

  6. Версионируйте плейбуки (Git).

  7. Избегайте shell / command, если есть модуль.

12. Ansible Vault (защита секретов)

Создание зашифрованного файла:

bash
ansible-vault create secret.yml

Редактирование:

bash
ansible-vault edit secret.yml

Запуск с паролем:

bash
ansible-playbook playbook.yml --ask-vault-pass

Пример содержимого secret.yml:

yaml
db_password: supersecret123
api_key: abc123xyz
Рубрики: Linux