rubric/modules/devopsmodules/devops_ansible.go

264 lines
8.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()
}