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 |