Автоматизуємо і прискорюємо процес налаштування хмарних серверів з Ansible. Частина 4: працюємо з модулями

У першій частині ми почали вивчення Ansible, популярного інструменту для автоматизації установки і розгортання ІТ-інфраструктури. Ansible був успішно встановлений в InfoboxCloud, описані принципи роботи, базова настройка. У завершенні статті ми показали як швидко встановити nginx на кілька серверів.

У другій частині ми розібралися у висновку playbook, навчилися налагоджувати і повторно використовувати скрипти Ansible.

У третій частині ми дізналися як написати єдиний Ansible playbook для різних ОС (наприклад, rpm і deb), як обслуговувати безліч хостів і не писати їх в inventory, і як згрупувати сервера по регіонах хмари. Було вивчено використання змінних Ansible і файлу inventory.



У цій частині ми навчимося використовувати модулі Ansible для налаштування сервера: розберемося, як запускати звичайні скрипти на віддалених серверах, використовувати шаблонизацию для файлів конфігурації, підставляючи необхідні змінні, і як використовувати системи управління версіями для отримання коду на сервер.

Модулі в Ansible

Ansible надає більше 200 модулів, таких як System, Network, Database, Файли і так далі. Ви можете використовувати модулі для налаштування свого IT-інфраструктури.

Командний модуль command
Модуль приймає ім'я команди і армументы. Змінні оболонки або операції (<,>,|,&) не будуть працювати з модулем command, т. к. обробляються оболонкою. Модуль command приймає наступні параметри:
  • chdir: Використовується для зміни поточної директорії, в якій виконується команда
  • creates: Створює файл
  • removes: Видаляє файл
Давайте напишемо найпростішу задачу перезавантаження сервера:
- name: Reboot machine
command: /sbin/shutdown-r now
sudo: yes



Командний модуль raw
Цей модуль слід використовувати, коли інші командні модулі використати не вдається. Це простий запуск віддалених команд сервера по SSH. Даний модуль працює навіть на серверах без встановленого Python.

Простий приклад установки пакета vim:
- name: Install vim
raw: yum-y install vim-common
sudo: yes



Ви зможете побачити, що пакет встановлений, але завдання не буде позначена як changed. Краще не використовувати raw модуль коли можливо.

Командний модуль script
Цей модуль використовується для копіювання скрипта на віддалену машину і виконання його. Модуль підтримує параметри creates і removes.

Давайте напишемо скрипт для перегляду кількості директорій в /etc і запустимо його на віддалених серверах (~/ansible/playbooks/scripts/list_number_of_directories.sh:
#/bin/bash
ls-l /etc | egrep '^d' | wc-l

Завдання, використовує модуль script виглядає так:
- name: List directories in /etc
script: ~/ansible/playbooks/scripts/list_number_of_directories.sh /etc
sudo: yes

Шлях до файлу скрипта задається щодо місця розташування файлу, що використовує модуль script. Наприклад, якщо дана задача описана у файлі завдання, імпортованому в playbook, розташування скрипта задається щодо файлу завдання, а не playbook.



Як видно з висновку виконання playbook з висновком налагоджувальної інформації -vv /etc 91 директорія.

Командний модуль shell
Ключова відмінність модуля shell від модуля command у тому, що він використовує /bin/sh за замовчуванням для запуску команд. Ви можете використовувати змінні оболонки і інші функції оболонки.

Файловий модуль: file
Модуль file дозволяє вам змінювати атрибути файлу. Ви можете створити файл, створити або видалити директорії рекурсивно, створити або видалити символічне посилання.

Давайте перевіримо, що httpd.conf має правильні права і власника:
- name: Ensure httpd conf has right permissions and owner/group
file: path=/etc/httpd/conf/httpd.conf owner=root group=root mode=0644
sudo: yes

Так як скрипти Ansible дозволяють досягти потрібного стану і при перезапуску скриптів — повторний запуск дозволить переконатися і поправити при необхідності права на доступ до файлів.

Подивимося, як створюються симлинки:
- name: Create a symlink in /tmp for httpd.conf
file: src=/etc/httpd/conf/httpd.conf dest=/tmp/httpd.conf owner=root group=root state=link
sudo: yes

Створимо директорії рекурсивно:
- name: Create recursive directories
file: path=/tmp/dir1/dir2/dir3 owner=root group=root mode=0777
sudo: yes

Файловий модуль template
Для створення шаблонів Ansible використовують мову шаблонізації Jinja2. Модуль template дозволяє також створювати файл на сервері.

Давайте створимо найпростіший шаблон (~/ansible/playbooks/templates/ansible_hostname).
This is a test file on {{ ansible_hostname }}

Завдання буде виглядати так:
- name: Create a template test
template: src=test dest=/tmp/testfile mode=644



Ansible створила файл testfile на серверах і застосувала шаблонизацию до нього. «ansible-for-config» — значення hostname.



Модуль template надає корисну опцію validate, дозволяє перевірити файл до його копіювання. Класичний приклад — файл конфігурації Apache. Для запуску перевірки синтаксису використовується команда:
httpd-t-f /etc/httpd/httpd.conf

Якщо все ОК — ви побачите «Syntax OK». Якщо ні — ви побачите помилку.

Давайте подивимося, як зробити таку ж перевірку в playbook:
- name: Create a virtual host
template: src=test.conf dest=test.conf mode=644 validate='httpd-t-f %s'
sudo: yes

Якщо використовується дозволяє робити перевірку конфігурацій, ви з допомогою опції validate зможете безпечніше застосовувати конфігурації.

Файловий модуль copy
За допомогою модуля copy можна копіювати файли на сервер.
- name: Copy file remotely
copy: src=test2.conf dest=/etc/test2.conf owner=root group=root mode=0644
sudo: yes

Модуль системи керування версіями git
У Ansible є підтримка різних систем контролю версій (svn, bzr, hg та інші), але ми розглянемо модуль git.

Встановимо git на сервера:
- ням: name=git state=installed
sudo: yes

Тепер отримаємо репозиторій зі скриптами з цих статей:
- name: Checkout ansible-playground repository
git: repo=https://github.com/trukhinyuri/ansible-playground.git dest=~/checkout
sudo: yes



До і після виконання завдання вважається SHA, який дозволяє зрозуміти, чи був репозиторій оновлено.

Якщо ви отримуєте файли по SSH — використовуйте параметри accept_key і key_file для установки ключа для доступу до сховища. Якщо потрібно використовувати ключ accept_key=yes. key_file вказує на шлях до ключа. Якщо ключ знаходиться в ~/.ssh — вказувати key_file не потрібно.

Висновок

У написанні статті дуже допомогла книга "Learning Ansible" і звичайно офіційна документація.

Всі експерименти з Ansible зручно проводити в InfoboxCloud, так як є можливість для кожного віртуального сервера встановити саме ту кількість ресурсів, яке необхідно для задачі (CPU/Ram/диск незалежно один від одного) або використовувати автомасштабування, а не вибирати VM з готових шаблонів. Коли експерименти не проводяться — можна просто вимкнути VM і оплачувати тільки вартість диску.

Якщо ви виявили помилку у статті, автор її з задоволенням виправить. Будь ласка напишіть в ЛС або на пошту про неї. Туди ж можна задавати питання по Ansible для освітлення в наступних статтях.

Успішної роботи!

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.