Установка и настройка Ansible в Unix/Linux

Установка и настройка Ansible в Unix/Linux

Ansible — бесплатное ПО для конфигурирования и управления компьютерами, сочетает в себе развертывание многоузлового программного обеспечения, выполнения различных задач и управление конфигурациями. Он управляет нодами (которые должны иметь поддержку Python 2.4 или более поздней версии) через SSH. Модули работают над JSON и стандартный вывод может быть написан на любом языке программирования. Система использует YAML для написании функций (задач выполнения).

Установка Ansible в CentOS/RedHat

Чтобы установить ansible для начала, стоит подключить репозиторий EPEL, вот статья как это сделать:

Как включить EPEL репозиторий на CentOS

После чего, обновим ОС:

# yum update

Устанавливаем ansible из пакета:

# yum -y install ansible

Установка Ansible в Fedora

После чего, обновим ОС:

# dnf -y update

Устанавливаем ansible из пакета:

# dnf -y install ansible

Или можно установить ansible как описывалось для Centos.

Установка Ansible в Debian/Ubuntu

Для Ubuntu 14.04 LTS

Для установки, на управляющем сервере введите:

# apt-key update && apt-get update && apt-get -y upgrade && apt-get -y install python-software-properties && apt-get -y install software-properties-common && apt-add-repository -y ppa:rquillo/ansible && apt-get update && apt-get -y install ansible

Для Debian

Здесь мы будем использовать официальный Ansible PPA репозиторий, по этому, добавляем его:

$ sudo apt-add-repository ppa:ansible/ansible -y

Обновляем ОС:

$ sudo apt-get update

И собственно, выполняем установку:

# apt-get install ansible -y

Установка Ansible на Mac OS X

Первое что необходимо сделать — Устанавливаем  Xcode:

# xcode-select --install

Нашел пакет ansible в репозитории homebrew, попробовал установить:

# brew install ansible

Установился 🙂

Установку можно выполнить и через python:

$ sudo easy_install pip
$ sudo pip install ansible --quiet

Опция «—quiet» — дает возможность установить пакет в «тихом» режиме без вывода на экран.

Чтобы обновить, используйте:

$ sudo pip install ansible --upgrade

Вы можете проверить, если у вас уже есть инструменты для разработчиков, выполнив:

captain@Macbook# pkgutil --pkg-info=com.apple.pkg.CLTools_Executables

package-id: com.apple.pkg.CLTools_Executables
version: 8.0.0.0.1.1472435881
volume: /
location: /
install-time: 1476084271
groups: com.apple.FindSystemFiles.pkg-group 
captain@Macbook#

Если инструменты не установлены, вы увидите этот вывод:

No receipt for 'com.apple.pkg.CLTools_Executables' found at '/'.

Или:

$ sudo CFLAGS=-Qunused-arguments CPPFLAGS=-Qunused-arguments pip install ansible

Установка ansible через GIT

Так же, вы можете установить ансибл из github.

Клонируем ansible с github-а:

# cd /usr/local/src && git clone git://github.com/ansible/ansible.git

Проверяем, загрузились ли модули:

# cd ansible && git submodule update --init --recursive

Установить некоторые необходимые модули:

# pip install paramiko PyYAML jinja2 httplib2

Собираем и устанавливаем:

$ python setup.py build
$ python setup.py install

Установим environment для ансибл:

# cd /usr/local/src/ansible && source hacking/env-setup

Вы можете убедиться, что вы используете альтернативный путь к ансибл  с помощью команды:

# which ansible

Готово.

Проверка версии ansible

Проверяем версию ansible:

$ ansible --version
ansible 2.1.1.0
 config file = /etc/ansible/ansible.cfg
 configured module search path = Default w/o overrides

Как работает ansible?

Главная цель Ansible — это с одного (можно сделать и пару) серверов с ансиблом можно было управлять всеми другими нодами. С такого сервера можно отправлять различные команды (набор некоторых инструкций, так называемых playbooks) на любую из подключенных нод на сервере. Выполнение команд выполняется путем подключения сервера к ноде через публичный ключ по SSH. Внизу представлена наглядная схема того как все на нем устроено:

Как работает Ansible

В файле «Host inventory» содержится информация о обслуживаемых нодах ( где собственно все команды будут исполнены). Конфигурационный файл с Ansible может быть использован для настройки  переменного окружения.

В ansible, используются playbooks — это набор инструкций и они состоят из задач. Плейбуки описываются с помощью функциональности модуля ядра самого Ansible ( так же, могут использовать сторонние модули). Playbooks — последовательность или набор команд в которых  так же, может использоваться различные проверки: если условие не выполняется, то определенные команды могут пропускаться. Данные кукбуки, описываются в формате YAML.

С Ansible API — вы можете запускать скрипты. Если скрипту-обертке (wrapper) может понадобится запуск playbook, то это можно сделать через API.

Настройка Ansible в Unix/Linux

Сам конфигурационный файл описывается в формате INI. Так же, имеется возможность переопределения части конфигурации( можно даже всего конфига) в параметрах playbook или в переменных окружения.
При выполнении команд, Ansible выполняет проверку и ищет наличия файла с конфигурациями в следующих расположениях:
Параметр ANSIBLE_CONFIG проверяется переменная окружения, который может быть указывать на файл конфигурации.

  • ./ansible.cfg – в текущей папке.
  • ~/.ansible.cfg — в домашней директории пользователя.
  • /etc/ansible/ansible.cfg — в папке, смого ansible.

Настройка через переменные окружения

Много опций, можно задать с помощью переменного окружения, для этого стоит использовать префикс ANSIBLE_ перед названием самого параметра с конфигурацией (большими буквами). Например:

export ANSIBLE_SUDO_USER=root

После чего переменная ANSIBLE_SUDO_USER может быть использована в playbook.

Настройка в ansible.cfg

Самих параметров в Ansible конфигурации много, но основные я перечислю:

  • hostfile: Данная опция указывает на путь к inventory file. В нем хранится список ваших хостов, к которым Ansible сможет выполнить подключение.
    Например: hostfile = /etc/ansible/hosts
  • library: Путь к папке. В ней сохранены все модули Ansible.
    Например: library = /usr/share/ansible
  • forks: Задается количество процессов, которые может породить Ansible. По-умолчанию параметр установлен в 5.
    Например: forks = 5
  • sudo_user: Пользователь который будет использоватся по умолчанию и от которого Ansible собственно будет выполнять запуск команд на удаленных нодах.
    Например: sudo_user = root
  • remote_port: Порт для соединения по SSH к нодам (по умолчанию использует стандартный 22-й порт).
    Например: remote_port = 22
  • host_key_checking: Данная опция  дает возможность выключить проверку SSH–ключа на хосте, но по-умолчанию даная проверка включена.
    Например: host_key_checking = False
  • timeout: Данная опция задает таймаут ( время попытки подключения по SSH).
    Например: timeout = 60
  • log_path: Путь для сохранения лог-файлов. По-умолчанию Ansible не сохранит их вообще.
    Например: log_path = /var/log/ansible.log

Пишем первый файл конфигурации Ansible

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

# mkdir ~/ansible
# cd ~/ansible

Также создаем директорию для сохранения всех модулей для Ansible и так же, директорию для сохранения всех логов (куда же без них):

# mkdir ~/ansible/modules
# mkdir ~/ansible/logs

Подошло время к созданию файл ansible.cfg:

$ vim ~/ansible/ansible.cfg

В него прописываем:

[defaults]
hostfile = ~/ansible/inventory
sudo_user = root
log_path = ~/ansible/logs/ansible.log

В новой версии ansible поля «hostfile» нет, за место его, есть другое:

inventory =  /etc/ansible/hosts

Указываем обслуживаемые сервера в host inventory

Как я описывал раньше, данный файл, служит для внесения IP адресов всех имеющихся нод ( те, которые будут обслуживаться) и так же, сгруппирую их. Для этого создаем файл inventory:

$ vim ~/ansible/inventory

И добавляем IP всех удаленных хостов:

[name_of_group]
alias ansible_ssh_node=IP_of_SERVER
some_your_host ansible_ssh_host=SERVER_IP

У меня это:

[experiments]
192.168.1.216
alias ansible_ssh_host=192.168.1.216

Возьму для примера, один сервер на локальной машине с 192.168.1.216.

Генерация ключа для ansible

Как я говорил ранее, ansible использует подключение SSH по ключу (для доступа к настраиваемым серверам), по этому, нужно сгенерировать его:

$ ssh-keygen

Или более расширенный вариант:

# ssh-keygen -t rsa -b 4096 -C "admin@linux-notes.org"

Заблокирую доступ к SSH каталогу, что только вы cмогли читать или писать в данную папку:

# chmod 700 ~/.ssh

Нужно изменить разрешения, чтобы сохранить этоти файлы в безопасности:

# chmod 600 ~/.ssh/id_rsa && chmod 644 ~/.ssh/id_rsa.pub

Создаем простой ключ, все пропускаем (нажимаем enter на все вопросы). После того как ключ сгенерировали, нужно его передать на все имеющийся ноды, для этого есть команда:

$ ssh-copy-id root@ip_адрес_настраиваемого_сервера

У меня это:

$ ssh-copy-id captain@192.168.1.216

PS: И так для каждой управляемой ноды!

Выставим правильные права:

# chmod 644  ~/.ssh/id_rsa.pub

Чтобы проверить работает ли все хорошо, можно подключится на сервер по SSH и если не спросит пароль, то все работает хорошо ( можно и выполнить ПИНГ на удаленный хост с сервера ансибл).

$ ssh captain@192.168.1.216

Можно попинговать обслуживаемые сервера:

$ ansible experiments -m ping


192.168.1.216 | success >> {
 "changed": false, 
 "ping": "pong"
}

Можно пингануть и проверить все сервера:

# ansible -m ping all

Можно так же, выполнить пинг по группированной группе:

# ansible -m ping experiments

Можно бы также указать индивидуальный хост:

# ansible -m ping  some_your_host1

We can specify multiple hosts by separating them with colons:

# ansible -m ping some_your_host_1:some_your_host_2

Опция «-m ping» — часть команды для анзибль которая дает возможность использовать модуль «Ping». Вы можете проверить работу данной команды с опций «-a» и проверить как работает данная опция.

Модуль «shell» позволяет нам послать команду на удаленный хост и получить результаты. Например, чтобы узнать использование памяти на нашей машине some_your_host_1, мы могли бы использовать:

$ ansible -m shell -a 'free -m' some_your_host_1

Или:

$ ansible -m command -a "df -h" 192.168.1.216

Проверка аптайма на серверах:

# ansible -m command -a "uptime" experiments

Проверить hostname и архитектуру на всех нодах:

# ansible -m command -a "arch" experiments
# ansible -m shell -a "hostname" experiments

Если нам нужен выход в файл, то можно и это сделать:

# ansible -m command -a "df -h" experiments > /home/captain/df_report.txt

Управление ansible конфигурациями

Работаем с playbook-ами

На playbook-ах основан собственно весь ansible, так как они служат ( содержат) для выполнения разных задач. Каждая написанная задача внутри самого Ansible использует кусок кода-модуля. Плейбуки, используют формат YAML, но собственно, любые другие ваши модули могут быть написаны на любом языке программирования.

Хочу заметить, что очень важно, чтобы формат сообщений от модулей был в JSON.

YAML

Каждый плейбук пишется на языке YAML и для ансибл, почти каждый YAML файл начинается с некоторого списка, а этот элемент данного списка — список пар «ключ-значение»(иногда зовут словарем).

Данные файлы обязаны начинаться с «—» (такой формат присущий YAML )и означает начало вашего документа.

Так же, все ваши списки должны находится с одинаковым отступом от начала каждой строки, и должны начинаться с пробела или «-«. Чтобы закомментировать, используйте «#».
Например:

---
#Message
- Administration
– Install

Словарь представлен в виде «ключ:» (двоеточие и пробел) «значение»:

---
#Message
site: linux-notes
blog: blog.linux-notes

При необходимости словари могут быть представлены в сокращенной форме:

---
#Comment
{site: linux-notes, blog: blog.linux-notes}

Можно указать логические значение (истина/ложь) так:

---
need_access: no
use_service: yes
file_conf: TRUE
read_value: True
kill_process: false

Целиком наш пример YAML–файла будет выглядеть так:

---
#About blog
site: linux-notes
blog: blog
must_read: True
themes:
- hosting
- cloud
- it
- geeks
brands:
- infobox
- infoboxcloud

Для переменных Ansible использует «{{ var }}». Если значение после двоеточия начинается с «{«, то YAML будет думать, что это словать.
Для использования переменных нужно заключить скобки в кавычки:

word: "{{ variable }}"

Этого достаточно для начала написания playbooks.

Пишем наш первый playbook

Playbooks может состоять из списка обслуживаемых серверов, переменных пользователя, задач, обработчиков (хендлеров) и т.д. Большинство настроек конфигурации можно переопределить в playbook. Каждый playbook состоит из одного или более действия (игры) в списке.

Цель игры — связать группу хостов с предопределенными ролями, представленными как вызов задач Ansible.

В качестве примера давайте рассмотрим процесс установки nginx.
Создадим директорию, где будут хранится playbooks:

$ mkdir ~/ansible/playbooks

Создадим файл setup_nginx.yml в директории playbooks:

$ vim ~/ansible/playbooks/setup_nginx.yml

со следующим содержанием:

---
- hosts: experiments
tasks:

- name: Install nginx package
apt: name=nginx update_cache=yes
sudo: yes

- name: Starting nginx service
service: name=nginx state=started
sudo: yes

Давайте рассмотрим содержимое:

  • hosts: Список хостов или группа, на которой вы запускаете задачу. Это поле обязательное и каждый playbook должен иметь его, за исключением ролей. Если указана хост-группа, сначала Ansible ее ищет в playbook, а затем в файле inventory. Узнать, на каких хостах будет происходить работа, можно командой: ansible-playbook —list-host, где – путь к вашему playbook (playbooks/setup_nginx.yml).
  • tasks: Задачи. Все playbooks содержат задачи. Задача — это список действий, которые вы хотите выполнить. Поле задачи содержит имя задачи (справочная информация о задаче для пользователя playbook), модуль, который должен быть выполнен и аргументы, требуемые для модуля. Параметр «name» опциональный, но рекомендуемый.

Команды

playbook для ansible
Выполнение плейбука с названием test_job.yml для определенного хоста или группы хостов (прописано в файле):

# ansible-playbook --check -i my_custom_hosts_file test_job.yml

Опция «-i» говорит ансиблу использовать произвольные хосты с файла. Иногда вы можете захотеть выполнить данный playbook (или часть его), только на определенных хостах. Вместо того, чтобы делать различные хосты в разные файлы, можно попробовать эти методы:

Используйте опцию «—limit» чтобы указать на каком хосте запустить указанный плейбук (например на host1):

# ansible-playbook -i all_hosts.inventory some_playbook.yml --limit "your_host_1"

Используйте опцию «—limit» чтобы указать несколько хостов (розделенные запятыми), например для  host1,host2,host3:

# ansible-playbook -i all_hosts.inventory some_playbook.yml --limit "your_host_1,your_host_2,your_host_3"

Используйте опцию «—limit» чтобы указать диапазон подобных хостов, например host10-host20 или host5-15:

# ansible-playbook -i all_hosts.inventory some_playbook.yml --limit your_host[10-20] 
# ansible-playbook -i all_hosts.inventory some_playbook.yml --limit your_host[5-15]

Используйте опцию «—limit» чтобы указать файл с которого будет браться хосты (должны идти в столбик):

# ansible-playbook -i all_hosts.inventory some_playbook.yml --limit @/path_to_file

Если вы не уверены в том, что опция «—limit» будет работать, вы можете использовать опцию «—list-hosts» и вы получите список хостов, на которых будет выполняться playbook.

Можно задавать так званые метки для некоторых задач и потом выполнять их по этим заданным меткам. Можно сделать задачу чтобы она выполнялась в любых условиях, независимо от меток. Это может быть сделано путем добавления:

always_run: yes

Примеры

Пример использования  «—tags» и «—skip-tags», открываем  main.yml файл и прописываем:

tasks:

- name: Copy MY_FILE_HERE_1
copy: src=/root/work/MY_FILE_HERE_1 dest=/root/work/MY_FILE_HERE_1
tags:
- MY_FILE_HERE_1

- name: Copy MY_FILE_HERE_2
copy: src=/root/work/MY_FILE_HERE_2 dest=/root/work/MY_FILE_HERE_2
tags:
- MY_FILE_HERE_2

- name: Copy MY_FILE_HERE_2
copy: src=/root/work/MY_FILE_HERE_3 dest=/root/work/MY_FILE_HERE_3
tags:
- MY_FILE_HERE_3

Теперь, если хотите скопирывать ТОЛЬКО MY_FILE_HERE_1, выполните:

# ansible-playbook main.yml --tags "MY_FILE_HERE_1"

Если хотите наоборот, скопировать все, НО КРОМЕ MY_FILE_HERE_1, запустите:

# ansible-playbook main.yml --skip-tags "MY_FILE_HERE_1"

Проверьте, какие задачи будут выполнены из данного плейбука «—tags или —skip-tags»:

# ansible-playbook main.yml --skip-tags "MY_FILE_HERE_1" --list-tags
# ansible-playbook main.yml --tags "MY_FILE_HERE_1" --list-tags

Пример хэш-цикла в ансибль:

- name: vim files
synchronize:
src=/absolute/repo/path/roles/common/files/{{ item.src }}
dest={{ item.dst }}
with_items:
- {src: vim/bundle, dst: /home/jefdaj/.vim }
- {src: vim/vimrc , dst: /home/jefdaj/.vimrc}
- {src: vim/bundle, dst: /root/.vim }
- {src: vim/vimrc , dst: /root/.vimrc }

- name: vim permissions
file: path={{ item.pth }} owner={{ item.own }} group={{ item.grp }} recurse=yes
with_items:
- {pth: /root/.vim , own: root , grp: root }
- {pth: /root/.vimrc , own: root , grp: root }
- {pth: /home/jefdaj/.vim , own: jefdaj, grp: jefdaj}
- {pth: /home/jefdaj/.vimrc, own: jefdaj, grp: jefdaj}

Выполнить любую команду с ансиблом — это просто:

# ansible -i my_inventory all -a "/bin/uptime" -f 10

Запускаем команду  «-a «/bin/uptime»»  на всех хостах ( опция «all») с определенного файла (опция «-i») с установленным паралельным использованием в 10.

Запускаем команды с использованием модуля «shell»:

# ansible -i my_inventory some_host -m shell -a 'echo $TERM'

Где, some_host — Хост, на котором будет выполняться команда.

Копируем файл на удаленный сервер:

$ ansible -i my_hosts -m copy -a "src=/my_local_path_file dest=my_destination_path_file"

Мы же создадим чистую роль:

# ansible-galaxy init jenkins-installation -p roles

PS: У меня запускается с текущей директории ( где находится проект с ансиблом).

Вот и все! Тема «Установка и настройка Ansible в Unix/Linux» завершена.

2 thoughts on “Установка и настройка Ansible в Unix/Linux

  1. Приветствую тебя. Сперва хочу поблагодарить тебя за проделанный труд. От души! Ну а теперь к делу. Скажи пожалуйста, как установить определенную версия ansible? Возможно ли это? Или всегда будет устанавливаться последняя? И еще, может ли быть какое-либо противоречие, если например писал playbook в одной версии, а пытаешься выполнить в другой?

  2. Спасибо за статью! Но для чайников можно было подробней расписать использование утилиты ssh-copy-id. Как минимум то, что при ее использовании надо перейти в каталог .ssh затем уже ее использовать с опцией -i [ ssh-copy-id -i *.pub root@root@ip_адрес_настраиваемого_сервера ]

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.