Ответ
Я никогда не устанавливаю и не настраиваю инструменты вручную на каждую машину. Весь процесс автоматизирован и идемпотентен.
Мой подход:
- Инфраструктура как код (IaC): Для серверов/виртуалок используем Terraform. Вместе с ресурсом (например, VM в GCP) сразу применяется скрипт начальной загрузки (cloud-init) или шаблон, который устанавливает базовый набор пакетов.
- Конфигурация как код: Основная установка и тонкая настройка выполняются системами управления конфигурацией, например, Ansible.
- Создаются роли (roles) для каждого инструмента (Docker, Prometheus, Nginx).
- Все переменные (версии, порты, пути) выносятся в отдельные файлы.
- Плейбук можно запустить много раз, и результат будет одинаковым.
Пример роли Ansible для установки Docker:
# tasks/main.yml
- name: Install prerequisites
apt:
name:
- apt-transport-https
- ca-certificates
- curl
- software-properties-common
state: present
- name: Add Docker GPG key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Add Docker repository
apt_repository:
repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable
state: present
- name: Install Docker CE
apt:
name: docker-ce
state: present
- name: Add user to docker group
user:
name: "{{ ansible_user }}"
groups: docker
append: yes
- Контейнеризация: Многие инструменты (например, Jenkins, GitLab Runner) я запускаю в Docker-контейнерах. Настройка в этом случае — это создание
Dockerfileи передача конфигов через volumes или environment variables. - Менеджеры версий: Для локальной разработки использую
asdf-vm, который позволяет управлять версиями Terraform, kubectl, Helm и других CLI-инструментов через единый интерфейс.