Автоматизируем и ускоряем процесс настройки облачных серверов с Ansible. Часть 4: работаем с модулями

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

Во второй части мы разобрались в выводе playbook, научились отлаживать и повторно использовать скрипты Ansible.

В третьей части мы узнали как написать единый Ansible playbook для разных ОС (например с rpm и deb), как обслуживать сотни хостов и не писать их все в inventory и как сгруппировать сервера по регионам InfoboxCloud. Было изучено использование переменных Ansible и файла inventory.



В этой части мы продолжим изучение Ansible: научимся использовать модули Ansible для настройки сервера: разберемся, как запускать самые обычные скрипты на удаленных серверах в InfoboxCloud, использовать шаблонизацию для файлов конфигурации, подставляя необходимые переменные, и как использовать системы управления версиями для получения кода на сервер.

Модули в Ansible

Ansible предоставляет более 200 модулей, таких как System, Network, Database, Files и так далее. Вы можете использовать модули для настройки своей IT-инфраструктуры.

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

ansible-playbook playbooks/reboot_server.yml

Командный модуль 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 test template
   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 на сервера:
- yum: 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, который позволяет понять, был ли репозиторий обновлен.

Несколько полезных параметров у модуля git: depth и version (какую версию получать).
Если вы получаете файлы по SSH – используйте параметры accept_key и key_file для установки ключа для доступа к репозиторию. Если нужно использовать ключ accept_key=yes. key_file указывает на путь к ключу. Если ключ находится в ~/.ssh – указывать key_file не нужно.

Заключение

В написании статьи очень помогла книга "Learning Ansible" и конечно официальная документация.

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

Если вы обнаружили ошибку в статье, автор ее с удовольствием исправит. Пожалуйста напишите в ЛС или на почту о ней. Туда же можно задавать вопросы по Ansible для освещения в последующих статьях.

Успешной работы!

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.