Урок 6-9: Переменные, шаблоны, роли и Vault
Часть 1: Переменные в Ansible
Объявление переменных
---
- name: Работа с переменными
hosts: webservers
# Переменные на уровне playbook
vars:
web_server: nginx
app_port: 8080
app_user: appuser
config_path: /etc/nginx
# Переменные из файла
vars_files:
- vars/main.yml
- vars/secret.yml
tasks:
- name: Использовать переменные
debug:
msg: "Сервер: {{ web_server }}, Порт: {{ app_port }}"
Group и Host переменные
Файл: group_vars/webservers.yml
---
# Переменные для группы webservers
web_server: nginx
app_port: 8080
max_connections: 1000
Файл: host_vars/web1.yml
---
# Переменные для конкретного хоста web1
hostname: web1.example.com
ip_address: 192.168.1.10
ssl_cert_path: /etc/ssl/certs/web1.crt
Типы переменных
---
- name: Различные типы переменных
hosts: all
vars:
# Строка
app_name: "myapp"
# Число
port: 8080
# Булево значение
enable_ssl: true
# Список
packages:
- nginx
- curl
- git
# Словарь (объект)
database:
host: localhost
port: 5432
name: myapp_db
# Сложная структура
users:
- name: john
groups: [sudo, wheel]
age: 25
- name: jane
groups: [sudo]
age: 30
tasks:
- name: Использовать список
debug:
msg: "Пакет: {{ packages[0] }}"
- name: Использовать словарь
debug:
msg: "БД хост: {{ database.host }}"
- name: Итерировать список
debug:
msg: "Пакет: {{ item }}"
loop: "{{ packages }}"
- name: Итерировать словарь
debug:
msg: "Пользователь: {{ item.name }}, возраст: {{ item.age }}"
loop: "{{ users }}"
Факты (Facts)
---
- name: Использование фактов
hosts: all
gather_facts: yes # Собрать информацию о системе
tasks:
- name: Показать имя хоста
debug:
msg: "Имя: {{ ansible_hostname }}"
- name: Показать ОС
debug:
msg: "ОС: {{ ansible_os_family }}"
- name: Показать версию Python
debug:
msg: "Python: {{ ansible_python_version }}"
- name: Показать IP адреса
debug:
msg: "IP: {{ ansible_all_ipv4_addresses }}"
- name: Показать свободную память
debug:
msg: "Память: {{ ansible_memfree_mb }} MB"
Register (Сохранение результатов)
---
- name: Register переменные
hosts: all
tasks:
- name: Выполнить команду
shell: df -h / | tail -1
register: disk_info
- name: Использовать результат
debug:
var: disk_info.stdout
- name: Условие на основе результата
debug:
msg: "Мало места!"
when: disk_info.stdout | regex_search('9[0-9]%')
Часть 2: Шаблоны (Templates)
Основы Jinja2 шаблонов
Файл: templates/nginx.conf.j2
server {
listen {{ app_port }};
server_name {{ app_hostname }};
# SSL сертификат
{% if enable_ssl %}
listen 443 ssl;
ssl_certificate {{ ssl_cert_path }};
ssl_certificate_key {{ ssl_key_path }};
{% endif %}
# Логи
access_log /var/log/nginx/{{ app_name }}_access.log;
error_log /var/log/nginx/{{ app_name }}_error.log;
# Проксирование
location / {
proxy_pass http://127.0.0.1:{{ backend_port }};
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Использование шаблонов в Playbook
---
- name: Развернуть конфиг с шаблоном
hosts: webservers
become: yes
vars:
app_name: myapp
app_port: 80
app_hostname: app.example.com
backend_port: 8080
enable_ssl: true
ssl_cert_path: /etc/ssl/certs/app.crt
ssl_key_path: /etc/ssl/private/app.key
tasks:
- name: Создать конфиг из шаблона
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/sites-available/{{ app_name }}.conf
owner: root
group: root
mode: '0644'
notify: Перезагрузить Nginx
handlers:
- name: Перезагрузить Nginx
service:
name: nginx
state: restarted
Фильтры Jinja2
---
- name: Фильтры
hosts: all
vars:
text: "Hello World"
number: 42
list_items: [1, 2, 3, 4, 5]
tasks:
- name: Преобразование текста
debug:
msg: |
Uppercase: {{ text | upper }}
Lowercase: {{ text | lower }}
Capitalize: {{ text | capitalize }}
Length: {{ text | length }}
- name: Математика
debug:
msg: |
Число: {{ number }}
Чётное: {{ number % 2 == 0 }}
Плюс 10: {{ number + 10 }}
- name: Работа со списками
debug:
msg: |
First: {{ list_items | first }}
Last: {{ list_items | last }}
Length: {{ list_items | length }}
Join: {{ list_items | join(',') }}
- name: Условные фильтры
debug:
msg: "{{ text | default('No value') }}"
Часть 3: Роли (Roles)
Структура роли
roles/
└── webserver/
├── tasks/
│ └── main.yml # Основные задачи
├── handlers/
│ └── main.yml # Handlers
├── templates/
│ ├── nginx.conf.j2
│ └── index.html.j2
├── files/
│ └── nginx.default
├── vars/
│ └── main.yml # Переменные роли
├── defaults/
│ └── main.yml # Значения по умолчанию
├── meta/
│ └── main.yml # Информация о роли
└── README.md
Создание простой роли
Файл: roles/webserver/tasks/main.yml
---
- name: Установить Nginx
apt:
name: nginx
state: present
- name: Скопировать конфиг
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Перезагрузить Nginx
- name: Запустить Nginx
service:
name: nginx
state: started
enabled: yes
Файл: roles/webserver/handlers/main.yml
---
- name: Перезагрузить Nginx
service:
name: nginx
state: restarted
Файл: roles/webserver/defaults/main.yml
---
app_port: 80
app_name: default
backend_port: 8080
enable_ssl: false
Использование ролей в playbook
---
- name: Развернуть веб-приложение
hosts: webservers
become: yes
roles:
- webserver
- monitoring
- security
Роли с параметрами
---
- name: Развернуть несколько приложений
hosts: all
become: yes
roles:
- role: webserver
vars:
app_port: 8080
app_name: app1
- role: webserver
vars:
app_port: 8081
app_name: app2
- role: database
vars:
db_type: postgres
db_version: 13
Часть 4: Ansible Vault (Секреты)
Создание Vault файла
# Создать новый зашифрованный файл
ansible-vault create secrets.yml
# Введите пароль и добавьте содержимое:
# db_password: "super_secret_password"
# api_key: "sk_live_..."
Команды Vault
# Просмотреть содержимое
ansible-vault view secrets.yml
# Отредактировать файл
ansible-vault edit secrets.yml
# Зашифровать существующий файл
ansible-vault encrypt credentials.yml
# Расшифровать файл
ansible-vault decrypt secrets.yml
# Изменить пароль
ansible-vault rekey secrets.yml
# Вывести содержимое в plaintext (осторожно!)
ansible-vault view secrets.yml --vault-password-file=password.txt
Использование Vault в playbook
# Запустить playbook с запросом пароля
ansible-playbook site.yml --ask-vault-pass
# Или с файлом пароля
ansible-playbook site.yml --vault-password-file=.vault_pass
# Или указать пароль через переменную окружения
export ANSIBLE_VAULT_PASSWORD_FILE=.vault_pass
ansible-playbook site.yml
Файл: .vault_pass (НЕ коммитить в Git!)
my_secret_password
Файл: group_vars/all/vault.yml (Зашифрованный)
---
# Зашифровано с помощью ansible-vault
db_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
66386d8445c2f5...
Использование в playbook:
---
- name: Использовать секреты
hosts: all
vars_files:
- group_vars/all/vault.yml
tasks:
- name: Подключиться к БД
postgres_db:
name: myapp
login_password: "{{ db_password }}"
Проверочный список
- [ ] Создаете и используете переменные
- [ ] Работаете с group/host переменными
- [ ] Используете факты системы
- [ ] Регистрируете результаты команд
- [ ] Создаете шаблоны с Jinja2
- [ ] Создали простую роль
- [ ] Используете роли в playbooks
- [ ] Защищаете секреты через Vault
Готовы? Переходите к продвинутым техникам! 🚀