Thank you for reading this post, don't forget to subscribe!
Большинство действий на удалённых хостах (нодах) можно выполнить с помощью модулей Ansible.
Например — модуль shell позволяет выполнять консольные команды на сервере:
1 |
$ ansible all -m shell -a 'echo $HOSTNAMEE' |
2 |
cent_ans_serv | success | rc=0 >> |
3 |
4 |
cent_ans_client1 | success | rc=0 >> |
Ключ -a
для модуля shell
используется для передачи ему аргументов.
Так же можно установить и какое-то приложение, например — lftp
.
Добавим пользователя mid в sudoers
, и разрешим ему выполнение команды без ввода пароля — вызываем visudo
, добавляем строку:
1 |
mid ALL=(ALL) NOPASSWD: ALL |
Повторяем на обоих хостах, после чего выполняем установку:
1 |
$ ansible all -s -m shell -a 'yum -y install lftp' |
2 |
... |
3 |
cent_ans_serv | success | rc=0 >> |
4 |
Loaded plugins: fastestmirror, security |
5 |
... |
6 |
Installed: |
7 |
lftp.i686 0:4.0.9-1.el6_5.1 |
8 |
9 |
Complete! |
Конечно, такой подход к установке пакетов не самый удобный. Поэтому — можно использовать модуль yum.
Например, установка nmap
на всех хостах с помощью модуля yum
выглядит так:
1 |
$ ansible all -s -m yum -a 'name=nmap state=latest' |
Проверяем:
1 |
$ yum list installed | grep nmap |
2 |
nmap.i686 2:5.51-4.el6 @base |
Ansible имеет огромное количество встроенных модулей, даже такие как ec2 — для управления серверами EC2 в AWS, или portinstall — для управления портами FreeBSD. Имеются и модули сторонних разработчиков, например — ansible-bamboo для управления сервером Bamboo.
Рассмотрим наиболее часто используемые модули и их параметры.
Модуль command
принимает команду и аргументы, разделенные пробелом. Аргументами могут быть:
chdir
— переход в каталог для выполнения команды;creates
— создание файла по указанному пути;removes
— удаление файла по указанному пути.
Для проверки работы модуля command напишем набор инструкций /etc/ansible/playbooks/install_ntpdate.yml
такого вида:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
--- - 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 |
Модуль shell
— это аналог модуля command
с важным отличием: для выполнения команд используется оболочка /bin/sh
. Параметры такие же, как и у модуля command
— chdir
, creates
и removes
.
Модуль script
используют при необходимости копирования скрипта на удаленный хост с последующим выполнением. Поддерживаются параметры creates
и removes
. Для проверки работы данного модуля напишем простейший скрипт /etc/ansible/playbooks/scripts/count_dir.sh
со следующим содержимым:
1 2 3 |
<span class="hljs-comment">#/bin/bash</span> ls <span class="hljs-_">-l</span> /var/<span class="hljs-built_in">log</span> | grep <span class="hljs-string">"^d"</span> | wc <span class="hljs-_">-l</span> |
Примечание. Скрипт посчитает количество директорий в /var/log
.
Playbook в этом случае будет выглядеть так:
1 2 3 4 5 6 7 8 9 |
--- - hosts: test tasks: - name: Count directories in /var/log script: /etc/ansible/playbooks/scripts/count_dir.sh /var/log sudo: yes Модуль <code>raw</code> предусмотрен для использования в случаях, когда другие командные модули (<code>command</code>, <code>shell</code> и <code>script</code>) использовать невозможно. Этот модуль можно использовать на удаленных хостах даже без установленного Python. Пример playbook: --- - hosts: test tasks: - name: Update & safe-upgrade raw: aptitude update && aptitude safe-upgrade -y sudo: yes |
Модуль file
предназначен для создания/удаления каталогов, символических ссылок и файлов, а также для работы с атрибутами файлов. Параметры:
group
— имя группы-владельца файла/каталога;owner
— имя пользователя-владельца файла/каталога;mode
— права доступа к файлу/каталогу;path
— путь к файлу/каталогу (можно использовать алиасы dest или name);src
— путь к файлу, для создания симлинка (используется приstate=link
);recurse
— рекурсивно установить атрибуты файла/каталога (используется приstate=directory
);state
— определяет типы файлов, над которым проводятся операции (file
,link
,directory
,hard
,touch
иabsent
).
Пример использования модуля в наборе инструкций:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
--- - 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 |
Модуль copy
используется для копирования файлов на удаленный хост. Кроме уже описанных выше параметров group
, owner
, mode
может принимать следующие:
backup
— создает резервную копию файла (в имени файла будет дописанtimestamp
);dest
— куда будет скопирован файл (абсолютный путь на удаленном хосте);directory_mode
— используется для рекурсивного копирования каталогов;force
— копировать файл на удаленный хост, если содержимое файла было изменено;src
— откуда копировать файл — локальный путь (абсолютный или относительный).
Пример использования в наборе инструкций:
1 2 3 4 5 6 7 8 9 |
--- - hosts: test tasks: - name: Copy speedtest-cli copy: src=/home/install/speedtest-cli dest=/usr/local/bin/speedtest-cli mode=0777 sudo: yes |
Для управления планировщиком задач используется модуль 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
:
1 2 3 4 5 6 7 8 9 |
--- - 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 Модуль <code>template</code> используется в <code>Ansible</code> для создания файлов по определенным шаблонам (например, конфигов) на удаленных хостах. Чтобы проверить работу данного модуля, создадим простенький шаблон <code>/etc/ansible/playbooks/templates/hostname/</code> с таким содержимым: |
1 2 |
This <span class="hljs-keyword">is</span> test file <span class="hljs-literal">on</span> {{ ansible_hostname }} |
Playbook с использованием модуля template
получится такой:
1 2 3 4 5 6 7 8 9 |
--- - hosts: test tasks: - name: Create template with hostname template: src=/etc/ansible/playbooks/templates/hostname dest=/home/admin/testfile mode=0644 sudo: yes |
На удаленном хосте по указанному нами пути появился файл со следующим содержимым:
1 2 |
This is <span class="hljs-built_in">test</span> file on <span class="hljs-built_in">test</span>-1 |
Примечание. Данный модуль также позволяет использовать функцию validate
, которая проверяет файл перед его копированием на удаленный сервер.
1 2 |