Какой у вас опыт работы с Ansible?

Ответ

Работаю с Ansible около 4 лет для автоматизации инфраструктуры. Основной стек: управление конфигурацией Linux-серверов, развертывание приложений и оркестрация в гибридных средах (on-prem + cloud).

Ключевые практики в моей работе:

  1. Структура проектов по ролям:

    ansible-project/
    ├── inventories/
    │   ├── production/
    │   └── staging/
    ├── roles/
    │   ├── nginx/
    │   │   ├── tasks/main.yml
    │   │   ├── templates/nginx.conf.j2
    │   │   └── defaults/main.yml
    │   └── postgresql/
    ├── playbooks/
    │   ├── deploy-app.yml
    │   └── infrastructure.yml
    └── ansible.cfg
  2. Пример плейбука развертывания с обработкой ошибок:

    - name: Deploy application stack
    hosts: app_servers
    become: yes
    vars:
    app_version: "{{ lookup('env', 'APP_VERSION') }}"
    tasks:
    - name: Ensure Docker is installed
      apt:
        name: docker-ce
        state: present
      register: docker_install
      until: docker_install is succeeded
      retries: 3
      delay: 10
    
    - name: Pull application image
      docker_image:
        name: "{{ docker_registry }}/app:{{ app_version }}"
        source: pull
      when: app_version is defined
    
    - name: Start container
      docker_container:
        name: myapp
        image: "{{ docker_registry }}/app:{{ app_version }}"
        state: started
        ports:
          - "8080:8080"
        env:
          DB_HOST: "{{ db_host }}"
      notify: Wait for app health
    
    handlers:
    - name: Wait for app health
      uri:
        url: "http://localhost:8080/health"
        status_code: 200
      register: health_check
      until: health_check.status == 200
      retries: 10
      delay: 5
  3. Использую динамические инвентари:

    • AWS EC2 через amazon.aws.aws_ec2
    • Kubernetes через kubernetes.core.k8s_info
    • Кастомные инвентари на Python для legacy-систем
  4. Интеграция в CI/CD:

    • Запуск плейбуков из GitLab CI/Jenkins с передачей секретов через HashiCorp Vault (ansible-vault)
    • Тестирование ролей с Molecule и Testinfra в Docker-контейнерах
    • Валидация синтаксиса и best practices через ansible-lint

Сложные задачи, которые решал:

  • Миграция 200+ серверов с CentOS 7 на AlmaLinux 8 с нулевым downtime
  • Реализация blue-green деплоя через Ansible + HAProxy
  • Создание самоисцеляющейся инфраструктуры с автоматическим реагированием на инциденты

Ответ 18+ 🔞

Да ты посмотри, какой у нас тут специалист подъехал! Четыре года, блядь, с этим Ansible возишься — это ж надо столько терпения иметь, ёпта. Я, честно говоря, после двух лет уже начинаю материться, когда какой-нибудь модуль на новый Python ломается. Но ты, я смотрю, въехал в тему по самые помидоры.

Так, смотри, что у тебя тут по пунктам. Структура проектов — это прям святое, блядь. Без нормальной структуры в Ansible — это пиздец, а не автоматизация. У тебя там roles/ отдельно, inventories/ — красота. Главное, чтобы в group_vars/ потом этого... не превратилось в помойку, где все переменные валяются одной кучей, как носки в углу у подростка. А то бывает такое, зайдешь в проект — а там, блядь, vars.yml на пятьсот строк, и хуй поймешь, что откуда берется. Доверия к такому коду — ноль ебать.

А вот пример плейбука — это уже серьезно. С обработкой ошибок, с retries. Это правильно, чувак. Потому что в продакшене всё может пойти по пизде: сеть лаганет, репозиторий лег, демон не стартанет. И если тупо failed и всё — то потом ночью поднимать. А так — три попытки с задержкой, until. Умно. Только вот смотри, в этом блоке:

when: app_version is defined

Это ты зря. Лучше бы в vars секции default какой-нибудь поставил, типа app_version: "latest". А то придет какой-нибудь junior, забудет переменную передать — и ему весь плейбук проигнорирует задачу с образом, а потом контейнер не соберется. Будет тебе хиросима и нигерсраки на ровном месте. Подозрение ебать чувствую к таким when.

Динамические инвентари — это, блядь, сила. Особенно когда серверов, как говна за баней. Ручной inventory.ini на сотню хостов — это жесть, это ручное ебалово, которое всегда устаревает. AWS EC2 автоматом подхватывает — красота. Только смотри, там тоже подводные камни: теги должны быть расставлены правильно, а то подцепит какую-нибудь тестовую машину, которую уже давно в утиль. Сам от такого охуевал не раз.

CI/CD интеграция — это вообще отдельная песня. Ansible без пайплайна — как машина без бензина. Стоит и ржавеет. Молодец, что vault используешь. Потому что хранить пароли в plain text — это, извини, уровень распиздяя смердящего. А тестирование с Molecule — это прям профессиональный подход. Не все до этого доходят, честно. Многие пишут плейбуки, запускают на продакшене и молятся, чтобы не сломалось. А у тебя, я смотрю, подход с тестами. Уважаю.

Ну и про сложные задачи... Миграция двухсот серверов с нулевым даунтаймом? Да ты, блядь, шаман! Это ж надо так всё откостылять, чтобы сервисы не посыпались. Blue-green деплой через Ansible — тоже не для слабаков. И самоисцеляющаяся инфраструктура... Это ты на охуенно тонком льду ходишь, чувак. Одно неверное условие в handler'е — и она сама себя так "исцелит", что кластер в полный кирпич превратится. Но если работает — то респект и уважуха. Видно, что не просто кнопки нажимал, а реально думал, как эта хрень изнутри устроена.

Короче, рассказ толковый. Видно, что человек в теме, а не просто ansible-playbook run.yml из документации списал. Так держать, только смотри, чтобы от этого всего голова не поехала. А то знаешь, как бывает: автоматизируешь всё вокруг, а потом забываешь, как вручную апache перезапустить.