264 lines
8.3 KiB
Go
264 lines
8.3 KiB
Go
package devopsmodules
|
||
|
||
import (
|
||
"rubric/utils"
|
||
)
|
||
|
||
var AnsibleModule = Module{
|
||
Key: "ansible",
|
||
Aliases: []string{"an", "ansible"},
|
||
Title: "Ansible — управление конфигурацией",
|
||
Description: "Инвентарь, playbook, роли, модули, vault, динамический инвентарь",
|
||
Run: showAnsible,
|
||
}
|
||
|
||
func showAnsible() {
|
||
utils.Header("DevOps — Ansible")
|
||
|
||
utils.Section("Основы и установка")
|
||
utils.Code(`Ansible — agentless: работает через SSH, не требует агентов на хостах.
|
||
Push-модель: управляющая машина отправляет команды.
|
||
|
||
# Установка:
|
||
pip install ansible # рекомендуется через pip
|
||
dnf install ansible # RHEL/Fedora
|
||
apt install ansible # Debian/Ubuntu
|
||
|
||
ansible --version
|
||
ansible-galaxy collection install community.general`)
|
||
|
||
utils.Section("Инвентарь (Inventory)")
|
||
utils.Code(`# /etc/ansible/hosts или ./inventory.ini:
|
||
# Статический инвентарь:
|
||
|
||
[webservers]
|
||
web1.example.com
|
||
web2.example.com ansible_port=2222
|
||
|
||
[databases]
|
||
db1.example.com ansible_user=dbadmin
|
||
|
||
[production:children]
|
||
webservers
|
||
databases
|
||
|
||
[all:vars]
|
||
ansible_python_interpreter=/usr/bin/python3
|
||
|
||
# YAML-формат (inventory.yml):
|
||
all:
|
||
children:
|
||
webservers:
|
||
hosts:
|
||
web1.example.com:
|
||
http_port: 80
|
||
web2.example.com:
|
||
databases:
|
||
hosts:
|
||
db1.example.com:
|
||
ansible_user: dbadmin`)
|
||
|
||
utils.Println(utils.ColorBold + "Ad-hoc команды:" + utils.ColorReset)
|
||
utils.Command("ansible all -i inventory.ini -m ping", "проверить доступность хостов")
|
||
utils.Command("ansible webservers -m command -a 'uptime'", "выполнить команду")
|
||
utils.Command("ansible all -m shell -a 'df -h'", "через shell")
|
||
utils.Command("ansible webservers -m apt -a 'name=nginx state=present' -b", "установить пакет")
|
||
utils.Command("ansible all -m gather_facts --tree /tmp/facts", "собрать факты")
|
||
utils.Command("ansible all -m setup -a 'filter=ansible_os_family'", "конкретный факт")
|
||
|
||
utils.Section("Playbook")
|
||
utils.Code(`# site.yml — основной playbook:
|
||
---
|
||
- name: Настройка веб-серверов
|
||
hosts: webservers
|
||
become: yes # sudo
|
||
vars:
|
||
nginx_port: 80
|
||
app_user: www-data
|
||
|
||
pre_tasks:
|
||
- name: Обновить кэш пакетов
|
||
apt:
|
||
update_cache: yes
|
||
cache_valid_time: 3600
|
||
|
||
tasks:
|
||
- name: Установить nginx
|
||
package:
|
||
name: nginx
|
||
state: present
|
||
|
||
- name: Скопировать конфигурацию
|
||
template:
|
||
src: templates/nginx.conf.j2
|
||
dest: /etc/nginx/nginx.conf
|
||
owner: root
|
||
mode: '0644'
|
||
notify: Перезапустить nginx
|
||
|
||
- name: Создать директорию приложения
|
||
file:
|
||
path: /var/www/myapp
|
||
state: directory
|
||
owner: "{{ app_user }}"
|
||
mode: '0755'
|
||
|
||
- name: Убедиться что nginx запущен
|
||
service:
|
||
name: nginx
|
||
state: started
|
||
enabled: yes
|
||
|
||
handlers:
|
||
- name: Перезапустить nginx
|
||
service:
|
||
name: nginx
|
||
state: restarted
|
||
|
||
- name: Настройка баз данных
|
||
hosts: databases
|
||
become: yes
|
||
roles:
|
||
- role: postgresql
|
||
vars:
|
||
pg_version: 16`)
|
||
|
||
utils.Println(utils.ColorBold + "Запуск playbook:" + utils.ColorReset)
|
||
utils.Command("ansible-playbook site.yml -i inventory.ini", "запустить")
|
||
utils.Command("ansible-playbook site.yml --check", "dry-run (без изменений)")
|
||
utils.Command("ansible-playbook site.yml --diff", "показать изменения файлов")
|
||
utils.Command("ansible-playbook site.yml --tags nginx", "только помеченные теги")
|
||
utils.Command("ansible-playbook site.yml --skip-tags debug", "пропустить теги")
|
||
utils.Command("ansible-playbook site.yml --limit web1.example.com", "только один хост")
|
||
utils.Command("ansible-playbook site.yml -e 'nginx_port=8080'", "переопределить переменную")
|
||
utils.Command("ansible-playbook site.yml -v", "verbose (-vvv для debug)")
|
||
|
||
utils.Section("Модули (основные)")
|
||
utils.Code(`# Файлы и шаблоны:
|
||
copy: — скопировать файл с управляющей машины
|
||
template: — шаблон Jinja2
|
||
file: — создать файл/директорию/ссылку
|
||
fetch: — скачать файл с хоста
|
||
lineinfile: — управление строками в файле
|
||
blockinfile: — управление блоками
|
||
|
||
# Пакеты и сервисы:
|
||
package: / apt: / dnf: / yum: — пакеты
|
||
service: / systemd: — сервисы
|
||
|
||
# Команды:
|
||
command: — выполнить команду (без shell)
|
||
shell: — выполнить через sh
|
||
raw: — без Python (для минимальных систем)
|
||
script: — выполнить локальный скрипт
|
||
|
||
# Пользователи:
|
||
user: — управление пользователями
|
||
group: — управление группами
|
||
authorized_key: — SSH-ключи
|
||
|
||
# Сеть:
|
||
uri: — HTTP-запросы
|
||
get_url: — скачать файл по URL
|
||
wait_for: — ждать порт/файл/условие`)
|
||
|
||
utils.Section("Переменные и шаблоны Jinja2")
|
||
utils.Code(`# Приоритет переменных (от низкого к высокому):
|
||
# defaults → inventory → group_vars → host_vars → play vars → task vars → extra-vars
|
||
|
||
# group_vars/webservers.yml:
|
||
nginx_version: "1.25"
|
||
nginx_worker_processes: auto
|
||
|
||
# host_vars/web1.example.com.yml:
|
||
nginx_port: 8080
|
||
|
||
# Шаблон templates/nginx.conf.j2:
|
||
worker_processes {{ nginx_worker_processes }};
|
||
|
||
events { worker_connections 1024; }
|
||
|
||
http {
|
||
server {
|
||
listen {{ nginx_port }};
|
||
server_name {{ inventory_hostname }};
|
||
|
||
{% if ssl_enabled %}
|
||
listen 443 ssl;
|
||
ssl_certificate {{ ssl_cert_path }};
|
||
{% endif %}
|
||
|
||
{% for location in nginx_locations %}
|
||
location {{ location.path }} {
|
||
proxy_pass {{ location.backend }};
|
||
}
|
||
{% endfor %}
|
||
}
|
||
}
|
||
|
||
# Фильтры Jinja2:
|
||
{{ variable | default('fallback') }}
|
||
{{ list | join(', ') }}
|
||
{{ string | upper }}
|
||
{{ path | basename }}
|
||
{{ number | int }}`)
|
||
|
||
utils.Section("Роли (Roles)")
|
||
utils.Code(`# Структура роли:
|
||
roles/
|
||
└── nginx/
|
||
├── defaults/main.yml # переменные по умолчанию
|
||
├── vars/main.yml # жёсткие переменные
|
||
├── tasks/main.yml # задачи
|
||
├── handlers/main.yml # обработчики
|
||
├── templates/ # шаблоны Jinja2
|
||
├── files/ # статические файлы
|
||
├── meta/main.yml # зависимости
|
||
└── README.md
|
||
|
||
# Создать структуру:
|
||
ansible-galaxy role init roles/nginx
|
||
|
||
# Использование роли в playbook:
|
||
- hosts: webservers
|
||
roles:
|
||
- nginx
|
||
- role: postgresql
|
||
vars:
|
||
pg_version: 16
|
||
|
||
# Установить роль из Galaxy:
|
||
ansible-galaxy install geerlingguy.nginx
|
||
# requirements.yml:
|
||
roles:
|
||
- name: geerlingguy.nginx
|
||
version: "3.2.0"
|
||
ansible-galaxy install -r requirements.yml`)
|
||
|
||
utils.Section("Ansible Vault — шифрование секретов")
|
||
utils.Code(`# Зашифровать файл:
|
||
ansible-vault encrypt vars/secrets.yml
|
||
ansible-vault encrypt_string 'mypassword' --name db_password
|
||
|
||
# Редактировать зашифрованный файл:
|
||
ansible-vault edit vars/secrets.yml
|
||
|
||
# Просмотр:
|
||
ansible-vault view vars/secrets.yml
|
||
|
||
# Расшифровать:
|
||
ansible-vault decrypt vars/secrets.yml
|
||
|
||
# Изменить пароль:
|
||
ansible-vault rekey vars/secrets.yml
|
||
|
||
# Использование в playbook:
|
||
ansible-playbook site.yml --ask-vault-pass
|
||
ansible-playbook site.yml --vault-password-file ~/.vault_pass
|
||
|
||
# .vault_pass (файл с паролем, не коммитить!):
|
||
echo 'myVaultPassword' > ~/.vault_pass
|
||
chmod 600 ~/.vault_pass`)
|
||
|
||
utils.Footer()
|
||
}
|