Как работает процесс автоматизации с использованием Ansible?

«Как работает процесс автоматизации с использованием Ansible?» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В моей практике Ansible — это основной инструмент для идемпотентной конфигурации серверов, развертывания приложений и оркестрации задач. Его архитектура без агентов (agentless) идеально подходит для управления разнородной инфраструктурой.

Как это работает на практике:

  1. Control Node: У меня на ноутбуке или CI/CD-сервере установлен Ansible. Отсюда я запускаю плейбуки.
  2. Инвентарь (Inventory): YAML-файл, где описаны все целевые хосты, сгруппированные по ролям.

    # inventory/production.yml
    webservers:
      hosts:
        web01.prod.example.com:
          ansible_user: deploy
        web02.prod.example.com:
          ansible_user: deploy
      vars:
        http_port: 443
        nginx_version: '1.24'
    
    databases:
      hosts:
        db-primary.prod.example.com:
          ansible_user: admin
        db-replica.prod.example.com:
          ansible_user: admin
  3. Плейбук (Playbook): Последовательность задач, применяемая к группе хостов.

    # playbooks/setup_webserver.yml
    - name: Configure Nginx on production webservers
      hosts: webservers  # Группа из инвентаря
      become: yes        # Выполнять задачи с повышенными привилегиями (sudo)
      vars:
        cert_path: /etc/ssl/certs/example.com.crt
        key_path: /etc/ssl/private/example.com.key
    
      tasks:
        - name: Ensure Nginx is installed at the correct version
          ansible.builtin.apt:
            name: nginx={{ nginx_version }}
            state: present
            update_cache: yes
    
        - name: Upload TLS certificate and key
          ansible.builtin.copy:
            src: "{{ item.src }}"
            dest: "{{ item.dest }}"
            mode: '0644'
            owner: root
            group: root
          loop:
            - { src: 'files/ssl_cert.crt', dest: '{{ cert_path }}' }
            - { src: 'files/ssl_key.key', dest: '{{ key_path }}', mode: '0600' }
    
        - name: Configure Nginx site
          ansible.builtin.template:
            src: templates/nginx_site.conf.j2
            dest: /etc/nginx/sites-available/default
            mode: '0644'
          notify: Reload Nginx  # Запускает handler, если задача изменила состояние
    
      handlers:
        - name: Reload Nginx
          ansible.builtin.service:
            name: nginx
            state: reloaded
  4. Выполнение:
    # Запуск плейбука с указанием инвентаря
    ansible-playbook -i inventory/production.yml playbooks/setup_webserver.yml

    Ansible по SSH подключается к хостам из группы webservers, выполняет задачи последовательно и идемпотентно (если Nginx уже установлен нужной версии, задача будет отмечена как ok, а не changed).

Ключевые преимущества в DevOps:

  • Идемпотентность: Плейбук можно запускать многократно с предсказуемым результатом — система приводится в желаемое состояние.
  • Декларативность: Я описываю желаемое состояние (установлен Nginx версии X, конфиг должен выглядеть так), а не последовательность команд.
  • Использование шаблонов Jinja2: Позволяет создавать динамические конфигурационные файлы.
    # templates/nginx_site.conf.j2
    server {
        listen {{ http_port }} ssl;
        server_name {{ inventory_hostname }};
        ssl_certificate {{ cert_path }};
        ssl_certificate_key {{ key_path }};
        location / {
            proxy_pass http://localhost:{{ app_port }};
        }
    }
  • Роли (Roles): Для сложных настроек я выношу логику в роли (например, nginx, postgresql, docker), что делает код модульным и переиспользуемым.
  • Ansible Vault: Для безопасного хранения секретов (паролей, ключей) прямо в репозитории.
    ansible-vault encrypt_string 'my_secret_password' --name 'db_password'
    # Результат вставляется в vars файл

Таким образом, Ansible позволяет мне управлять сотнями серверов как кодом (Infrastructure as Code), обеспечивая согласованность, повторяемость и возможность отслеживания изменений через Git.