Образовательный проект «SnakeProject» Михаила Козлова

Навигация

⇒ FreeBSD and Nix ⇐

CISCO

Voice(Asterisk\Cisco)

Microsoft

Powershell

Python

SQL\T-SQL

Общая

WEB Разработка

ORACLE SQL \ JAVA

Мото

Стрельба, пневматика, оружие

Саморазвитие и психология


Ansible и простой пример role


Ansible и простой пример 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 <имя роли>
 
Возможные роли см. в документации:
https://galaxy.ansible.com/ui/
 
Например 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
 
 

Комментарии пользователей

Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!

Контакты Группа ВК Сборник материалов по Cisco, Asterisk, Windows Server, Python и Django, SQL и T-SQL, FreeBSD и LinuxКод обмена баннерами Видео к IT статьям на YoutubeВидео на другие темы Смотреть
Мои друзья: Советы, помощь, инструменты для сис.админа, статическая и динамическая маршрутизация, FreeBSD

© Snakeproject.ru создан в 2013 году.
При копировании материала с сайта - оставьте ссылку.
Весь материал на сайте носит ознакомительный характер,
за его использование другими людьми, автор ответственности не несет.

Рейтинг@Mail.ru
Рейтинг@Mail.ru Яндекс.Метрика





Поддержать автора и проект