в ansible, debian, ubuntu

Знакомство с Ansible. Часть 4: модули

ansible
Мы уже справились установкой системы управления конфигурациями 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. Параметры такие же, как и у модуля commandchdir, 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 все, в следующей статье поговорим о ролях и об использовании условий в наборах инструкций.

Добавить комментарий