Ответ
В моей практике Ansible — это основной инструмент для идемпотентной конфигурации серверов, развертывания приложений и оркестрации задач. Его архитектура без агентов (agentless) идеально подходит для управления разнородной инфраструктурой.
Как это работает на практике:
- Control Node: У меня на ноутбуке или CI/CD-сервере установлен Ansible. Отсюда я запускаю плейбуки.
-
Инвентарь (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 -
Плейбук (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 - Выполнение:
# Запуск плейбука с указанием инвентаря ansible-playbook -i inventory/production.yml playbooks/setup_webserver.ymlAnsible по 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.