| Навигация
|
Ansible и простой пример roleAnsible и простой пример role
Наши конфиги
/etc/ansible/ansible.cfg
[defaults]
inventory = inventory.yaml
remote_user = your_remote_username
private_key_file = ~/.ssh/id_rsa
/etc/ansible/inventory.yaml
all:
children:
frontend:
hosts:
www1:
ansible_host: 192.168.1.1
www2:
ansible_host: 192.168.1.2
backend:
hosts:
app1:
ansible_host: 192.168.1.3
ansible_user: any_username
ansible_ssh_private_key_file: ~/.ssh/id_rsa_back
Проверочки:
ansible all -m ping
ansible frontend -m ping
ansible backend -m ping
Примерчики работы с модулями:
ansible practicum_servers -b -m shell -a "useradd test_user1"
ansible practicum_servers -b -m user -a "name=test_user2 state=present"
ansible practicum_servers -b -m copy -a "src=script.sh dest=/tmp/ mode=755"
Пример роли
Нам понадобиться предварительно зашифрованный файл с секртными данными
Пример:
ansible-vault create secrets.yml
grafana_password: vault_password
grafana_databasepath: grafana_db.db
В итоге будет что-то типа secrets.yml:
$ANSIBLE_VAULT;1.1;AES256
111
Отредактировать зашифрованный файл:
ansible-vault edit <file>
Инициализируем роль
Синтаксис: ansible-galaxy role init <имя роли>
Возможные роли см. в документации:
Например grafana:
ansible-galaxy role init grafana
Перейдем к сути, типовая структура роли:
role_name/ # Имя каталога (имя роли)
├── defaults/ # Переменные по умолчанию
├── vars/ # Переменные более высокого приоритета
├── tasks/ # Задачи
├── handlers/ # Обработчики
├── templates/ # Файлы шаблонов
├── files/ # Статичные файлы
├── meta/ # Метаинформация
└── tests/ # Тесты
Опишем главный файл, точку входа, имя сами придумайте playbook_roles.yml:
- name: Install_Grafana_and_configure
hosts: app1
become: yes
# Подключим зашифрованный выше файл
vars_files:
- secrets.yml
roles:
- grafana
# В данной секции можно определить какие-либо переменные, пример:
# vars:
# my_var: "any_content"
Переменные с значениями по умолчанию в grafana/defaults/main.yml:
---
grafana_version: 12.13.2
grafana_admin: admin_name
grafana_password: admin_pass
grafana_db_path: grafana_db_role.db
log_mode: file
log_level: info
log_max_lines: 50
log_max_size: 50
log_max_days: 5
env_type: production
Jinja2-шаблон
{# #} - комментарии
{{ }} - вывод значений переменных и результатов выражений
{% %} - действия
Шаблон конфига графаны grafana/templates/grafana.ini.j2:
[security]
# В фигурных скобках {{}} имена переменных, подставляются значения
admin_user = {{ grafana_admin }}
admin_password = {{ grafana_password }}
[database]
path = {{ grafana_db_path }}
[log]
# default подставит значение по умолчанию, если переменная пуста
# можно менять регистр lower или upper, пример: {{ var_name | upper }}
# или выполнить замену в тексте {{ path | replace(" ", "-") }}
mode = {{ log_mode | default('file') }}
{# Условия с помощью default значения и конструкции if else #}
level = {{ log_level | default('debug' if env_type == 'production' else 'info' ) }}
# Конструкция условия if:
{% if log_mode == 'file' %}
logs_path = {{ log_path | default('/var/log/grafana') }}
log_file_name = {{ log_filename | default('grafana.log') }}
max_lines = {{ log_max_lines | default(100) }}
max_size = {{ log_max_size | default(100) }}
daily_rotate = {{ log_daily_rotate | default(true) | lower }}
max_days = {{ log_max_days | default(10) }}
# Если условие не выполнилось
{% elif log_mode == 'syslog' %}
syslog_address = {{ log_syslog_address | default('localhost:514') }}
syslog_facility = {{ log_facility | default('daemon') }}
syslog_format = {{ log_format | default('rfc5424') }}
# Окончание блока if
{% endif %}
# Проверить, определена ли переменная: {{ var_name is defined }}
Обработчик для перезапуска графаны grafana/handlers/main.yaml:
- name: Enable_Grafana_and_start_service
# Если задача изменит состояние, вернет changed: true, то можно вызвать обработчик через директиву notify
# Обработчики выполняются не сразу, а ставятся в очередь и запускаются единожды в конце выполнения задач
systemd_service:
name: grafana-server
state: restarted
enabled: yes
Сами задачи в grafana/tasks/main.yml:
---
- name: Grafana_package_install
block:
# Проверяем, установлена ли уже графана и заносим результат поиска в grafana_installed
- name: Grafana_check_installed
command: which grafana-server
ignore_errors: true
register: grafana_installed
- name: Grafana_package_install
apt:
update_cache: yes
deb: https://dl.grafana.com/oss/release/grafana_{{ grafana_version }}_amd64.deb
# Проверка, была ли установлена ранее и в каком типе ОС находимся
when: grafana_installed.rc != 0 and ansible_os_family == "Debian"
# В секции block описываются задачи
# Если в них возникнет ошибка, выполнение перейдет в секцию rescue, где можно обработать сбой
# Секция always выполнится независимо от результата и наличия ошибок в блоке
rescue:
- name: Install error
debug:
msg: "Error! Grafana not installed!"
- name: Grafana_template_config
template:
src: templates/grafana.ini.j2
dest: /etc/grafana/grafana.ini
owner: root
group: grafana
mode: '0640'
# Вызов обработчика из handlers для презапуска сервиса
notify:
- Enable_Grafana_and_start_service
- name: Grafana_enable_and_start_service
systemd_service:
name: grafana-server
state: restarted
enabled: yes
Запускаем:
ansible-playbook --ask-vault-pass playbook_roles.yaml
Комментарии пользователей Эту новость ещё не комментировалиНаписать комментарий Анонимам нельзя оставоять комментарии, зарегистрируйтесь! |
| Контакты Группа ВК | Видео к IT статьям на YoutubeВидео на другие темы Смотреть | ||||
Мои друзья: ![]() |
© Snakeproject.ru создан в 2013 году.При копировании материала с сайта - оставьте ссылку.Весь материал на сайте носит ознакомительный характер,за его использование другими людьми, автор ответственности не несет. |
||||
Поддержать автора и проект
|
|||||