Установка и настройка 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. Внизу представлена наглядная схема того как все на нем устроено:
В файле «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» завершена.
Приветствую тебя. Сперва хочу поблагодарить тебя за проделанный труд. От души! Ну а теперь к делу. Скажи пожалуйста, как установить определенную версия ansible? Возможно ли это? Или всегда будет устанавливаться последняя? И еще, может ли быть какое-либо противоречие, если например писал playbook в одной версии, а пытаешься выполнить в другой?
Спасибо за статью! Но для чайников можно было подробней расписать использование утилиты ssh-copy-id. Как минимум то, что при ее использовании надо перейти в каталог .ssh затем уже ее использовать с опцией -i [ ssh-copy-id -i *.pub root@root@ip_адрес_настраиваемого_сервера ]