Знакомство с Ansible. Часть 4: модули
Nov 9, 2015 20:35 · 1027 words · 5 minute read
Мы уже справились установкой системы управления конфигурациями Ansible
, написали первый набор инструкций (playbook) и разобрали результат его выполнения, а также ознакомились с использованием переменных в Ansible
.
В этой части давайте разберемся с модулями в Ansible
.
Система управления конфигурациями Ansible
позволяет использовать более двух сотен модулей (полный список модулей и их параметры) для настройки IT-инфраструктуры.
Рассмотрим наиболее часто используемые модули и их параметры.
Модуль command
принимает команду и аргументы, разделенные пробелом. Аргументами могут быть:
chdir
— переход в каталог для выполнения команды;creates
— создание файла по указанному пути;removes
— удаление файла по указанному пути.
Для проверки работы модуля command напишем набор инструкций /etc/ansible/playbooks/install_ntpdate.yml
такого вида:
---
- hosts: test
tasks:
- name: Check if ntpdate is installed
command: dpkg-query -W ntpdate
register: ntpdate_check_deb
failed_when: ntpdate_check_deb.rc > 1
changed_when: ntpdate_check_deb.rc == 1
- name: Install ntpdate
apt: name=ntpdate update_cache=yes
sudo: yes
when: ntpdate_check_deb.rc == 1
- name: Sync date
command: ntpdate -u 192.168.0.13
sudo: yes
Результат выполнения данного playbook будет таким:
ansible-playbook install_ntpdate.yml
PLAY [test] *******************************************************************
GATHERING FACTS ***************************************************************
ok: [test-1]
TASK: [Check if ntpdate is installed] *****************************************
ok: [test-1]
TASK: [Install ntpdate] *******************************************************
skipping: [test-1]
TASK: [Sync date] *************************************************************
changed: [test-1]
PLAY RECAP ********************************************************************
test-1 : ok=3 changed=1 unreachable=0 failed=0
Модуль shell
— это аналог модуля command
с важным отличием: для выполнения команд используется оболочка /bin/sh
. Параметры такие же, как и у модуля command
— chdir
, creates
и removes
.
Модуль script
используют при необходимости копирования скрипта на удаленный хост с последующим выполнением. Поддерживаются параметры creates
и removes
. Для проверки работы данного модуля напишем простейший скрипт /etc/ansible/playbooks/scripts/count_dir.sh
со следующим содержимым:
#/bin/bash
ls -l /var/log | grep "^d" | wc -l
Примечание. Скрипт посчитает количество директорий в /var/log
.
Playbook в этом случае будет выглядеть так:
---
- hosts: test
tasks:
- name: Count directories in /var/log
script: /etc/ansible/playbooks/scripts/count_dir.sh /var/log
sudo: yes
Результат выполнения данного набора инструкций (с выводом отладочной информации) следующий:
ansible-playbook -vv count_directories.yml
PLAY [test] *******************************************************************
GATHERING FACTS ***************************************************************
REMOTE_MODULE setup
ok: [test-1]
TASK: [Count directories in /var/log] *****************************************
changed: [test-1] => {"changed": true, "rc": 0, "stderr": "", "stdout": "15\r\n"}
PLAY RECAP ********************************************************************
test : ok=2 changed=1 unreachable=0 failed=0
Модуль raw
предусмотрен для использования в случаях, когда другие командные модули (command
, shell
и script
) использовать невозможно. Этот модуль можно использовать на удаленных хостах даже без установленного Python. Пример playbook:
---
- hosts: test
tasks:
- name: Update & safe-upgrade
raw: aptitude update && aptitude safe-upgrade -y
sudo: yes
и результат его выполнения:
ansible-playbook safe_upgrade.yml
PLAY [test] *******************************************************************
GATHERING FACTS ***************************************************************
ok: [test-1]
TASK: [Update & safe-upgrade] *************************************************
ok: [test-1]
PLAY RECAP ********************************************************************
test-1 : ok=2 changed=0 unreachable=0 failed=0
Модуль file
предназначен для создания/удаления каталогов, символических ссылок и файлов, а также для работы с атрибутами файлов. Параметры:
group
— имя группы-владельца файла/каталога;owner
— имя пользователя-владельца файла/каталога;mode
— права доступа к файлу/каталогу;path
— путь к файлу/каталогу (можно использовать алиасы dest или name);src
— путь к файлу, для создания симлинка (используется приstate=link
);recurse
— рекурсивно установить атрибуты файла/каталога (используется приstate=directory
);state
— определяет типы файлов, над которым проводятся операции (file
,link
,directory
,hard
,touch
иabsent
).
Пример использования модуля в наборе инструкций:
---
- hosts: test
vars:
dir: /home/admin/testdir
tasks:
- name: Create directory
file: path={{ dir }} state=directory owner=admin group=admin mode=0777
sudo: yes
- name: Create symlink
file: src=/etc/hostname dest=/home/admin/testdir/hostname owner=root group=root state=link
sudo: yes
Результат выполнения playbook:
ansible-playbook mkdir.yml
PLAY [test] *******************************************************************
GATHERING FACTS ***************************************************************
ok: [test-1]
TASK: [Create directory] ******************************************************
ok: [test-1]
TASK: [Create symlink] ********************************************************
changed: [test-1]
PLAY RECAP ********************************************************************
test-1 : ok=3 changed=1 unreachable=0 failed=0
Модуль copy
используется для копирования файлов на удаленный хост. Кроме уже описанных выше параметров group
, owner
, mode
может принимать следующие:
backup
— создает резервную копию файла (в имени файла будет дописанtimestamp
);dest
— куда будет скопирован файл (абсолютный путь на удаленном хосте);directory_mode
— используется для рекурсивного копирования каталогов;force
— копировать файл на удаленный хост, если содержимое файла было изменено;src
— откуда копировать файл — локальный путь (абсолютный или относительный).
Пример использования в наборе инструкций:
---
- hosts: test
tasks:
- name: Copy speedtest-cli
copy: src=/home/install/speedtest-cli dest=/usr/local/bin/speedtest-cli mode=0777
sudo: yes
и результат выполения playbook:
ansible-playbook copy.yml
PLAY [test] *******************************************************************
GATHERING FACTS ***************************************************************
ok: [test-1]
TASK: [Copy speedtest-cli] ****************************************************
ok: [test-1]
PLAY RECAP ********************************************************************
test-1 : ok=2 changed=0 unreachable=0 failed=0
Для управления планировщиком задач используется модуль cron
. Может принимать следующие параметры:
backup
— создает резервную перед изменением;cron_file
— использует указанный файл из каталогаcron.d
вместо пользовательскогоcrontab
;day
— день запуска задачи (1-31, *, */2);hour
— час запуска задачи (0-23, *, */2);minute
— минута запуска задачи (0-59, *, */2);month
— месяц запуска задачи (1-12, *, */2);weekday
— неделя запуска задачи (0-6 for Sunday-Saturday, *);disabled
— закомментировать ранее добавленную задачу;job
— задача;name
— описание задачи в crontab (комментарий);state
— существует ли такая задача(принимает значения present и absent);user
— пользователь, в чей crontab следует добавить задачу;special_time
— специальное время запуска задачи (reboot, yearly, annually, monthly, weekly, daily и hourly).
Пример playbook с использованием модуля cron
:
---
- hosts: test
tasks:
- name: Add task to cron
cron: name="check speedtest" minute="0" hour="1,10" job="/usr/local/bin/speedtest.sh"
sudo: yes
результатом выполнения задачи будет:
ansible-playbook cron.yml
PLAY [test] *******************************************************************
GATHERING FACTS ***************************************************************
ok: [test-1]
TASK: [Add task to cron] ******************************************************
ok: [test-1]
PLAY RECAP ********************************************************************
test-1 : ok=2 changed=0 unreachable=0 failed=0
Модуль template
используется в Ansible
для создания файлов по определенным шаблонам (например, конфигов) на удаленных хостах. Чтобы проверить работу данного модуля, создадим простенький шаблон /etc/ansible/playbooks/templates/hostname/
с таким содержимым:
This is test file on {{ ansible_hostname }}
Playbook с использованием модуля template
получится такой:
---
- hosts: test
tasks:
- name: Create template with hostname
template: src=/etc/ansible/playbooks/templates/hostname dest=/home/admin/testfile mode=0644
sudo: yes
Результатом выполнения этого набора инструкций будет:
ansible-playbook create_template.yml
PLAY [test] *******************************************************************
GATHERING FACTS ***************************************************************
ok: [test-1]
TASK: [Create template with hostname] *****************************************
changed: [test-1]
PLAY RECAP ********************************************************************
test-1 : ok=2 changed=1 unreachable=0 failed=0
На удаленном хосте по указанному нами пути появился файл со следующим содержимым:
This is test file on test-1
Примечание. Данный модуль также позволяет использовать функцию validate
, которая проверяет файл перед его копированием на удаленный сервер.
На этом с модулями в Ansible
все, в следующей статье поговорим о ролях и об использовании условий в наборах инструкций.