Russian (Pусский) translation by Masha Kolesnikova (you can also view the original English article)
Обзор
Это первая часть руководства из двух частей по Ansible. В этой части вы узнаете, что такое Ansible, как его установить и настроить, и как установить локальный кластер Vagrant для его тестирования. Затем вы найдете инвентарь, модули, специальные команды, книги, стратегии запуска, блоки и хранилище.
Что такое Ansible?
Ansible - это инструмент управления конфигурацией и оркестровки. Он работает в том же домене, что и Puppet, Chef и Saltstack. Это означает, что с помощью Ansible вы можете удаленно предоставлять целый парк удаленных серверов, устанавливать и развертывать на них программное обеспечение и отслеживать их удаленно.
Ansible - это проект с открытым исходным кодом, реализованный на Python и имеющий подключаемую архитектуру с модулями, которые могут управлять практически любой операционной системой, облачной средой и инструментом или средой системного администрирования. Вы также можете довольно легко расширить его с помощью своих собственных плагинов, если вы хотите сделать что-то особенное.
Одной из уникальных особенностей Ansible является то, что он не устанавливает никакого программного обеспечения на управляемые машины. Управляет машинами удаленно через SSH. Чтобы управлять удаленным компьютером, вам просто нужно убедиться, что ваш открытый ключ SSH находится в файле авторизованных ключах этого компьютера.
Начало работы с Ansible
Ansible работает на управляющей машине и может управлять серверами под управлением любой операционной системы, но управляющая машина не может быть машиной Windows на данный момент. Я буду использовать Mac OS X в этом руководстве в качестве контрольной машины.
Установка
Ansible требует Python 2.6 или 2.7. Чтобы установить его, введите:
pip install ansible
В Mac OS X рекомендуется увеличить количество дескрипторов файлов:
sudo launchctl limit maxfiles 1024 unlimited
Если вы видите ошибку типа «Слишком много открытых файлов», вам, вероятно, нужно это сделать.
Чтобы проверить правильность установки Ansible, введите ansible --version
. Вы увидите следующее:
ansible 2.0.0.2 config file = configured module search path = Default w/o overrides
Конечно, номер версии может быть другим.
Файл конфигурации Ansible
Ansible имеет файл конфигурации, который позволяет вам управлять многими опциями. Порядок поиска:
- ANSIBLE_CONFIG (переменная окружения)
- ansible.cfg (в текущем каталоге)
- .ansible.cfg (в домашнем каталоге)
- /etc/ansible/ansible.cfg
Вы также можете переопределить определенные параметры, используя отдельные переменные среды, которые имеют приоритет над файлом конфигурации.
Проверьте документацию Ansible, чтобы узнать обо всех вариантах.
Настройте Кластер Vagrant
Чтобы по-настоящему понять всю мощь Ansible, вам нужно несколько серверов для управления. В этом руководстве я буду использовать кластер Vagrant из 3 виртуальных машин, но для Ansible это всего лишь несколько хостов, которыми он должен управлять. Чтобы узнать больше о Vagrant, ознакомьтесь с разделом Введение в Vagrant.
Сначала установите VirtualBox и Vagrant. Затем поместите следующее в файл с именем Vagrantfile в рабочем каталоге.
# -*- mode: ruby -*- # vi: set ft=ruby : hosts = { "larry" => "192.168.88.10", "curly" => "192.168.88.11", "moe" => "192.168.88.12" } Vagrant.configure("2") do |config| config.vm.box = "precise64" config.vm.box_url = "http://files.vagrantup.com/precise64.box" hosts.each do |name, ip| config.vm.define name do |machine| machine.vm.network :private_network, ip: ip machine.vm.provider "virtualbox" do |v| v.name = name end end end end
Затем наберите vagrant up
. Vagrant создаст для вас три виртуальные машины, доступные как larry, curly и moe. Чтобы проверить, введите vagrant status
. Вы должны увидеть:
Current machine states: larry running (virtualbox) curly running (virtualbox) moe running (virtualbox) This environment represents multiple VMs. The VMs are all listed above with their current state. For more information about a specific VM, run `vagrant status NAME`.
Чтобы убедиться, что вы можете использовать SSH на хостах кластера, введите: vagrant ss >> ~ / .ssh / config
.
Теперь вы можете использовать SSH на любом из ваших виртуальных серверов, используя их имя хоста. Например: ssh curly
. Это позволит Ansible подключаться к хостам вашего кластера через SSH без каких-либо проблем с именами пользователей, паролями или ключами.
Инвентарь
Теперь, когда у нас есть кластер, нам нужно рассказать об этом Ansible. Это делается с помощью инвентарного файла. Файл инвентаризации - это список имен хостов, организованных в группы с использованием формата файла INI. Поместите следующее в файл с именем 'hosts' в вашей рабочей директории.
[funny] larry [funnier] curly moe
Я поместил «larry» в группу «funny», а остальные хосты в группу «funnier». Эта организация позволит нам выполнять действия в отношении этих групп. Вы также можете выполнять действия на отдельных хостах и на всех хостах.
Модули
Ansible имеет очень модульную и расширяемую архитектуру. Все его возможности организованы в модули. Есть основные модули и дополнительные модули. Каждый модуль представляет команду, и большинство принимает аргументы. Вы можете использовать модули непосредственно в специальных командах или в книгах воспроизведения. Вы можете прочитать обо всех модулях в документации.
Специальные команды
Пришло время взяться за дело. Простейший способ использования Ansible - запуск специальных команд. Специальные команды используют модули. Формат специальной команды:
ansible -i -m [-a , ... ]
Например, чтобы увидеть, все ли хосты в вашем инвентаре работают, вы можете использовать модуль ping (без аргументов):
ansible all -i hosts -m ping curly | SUCCESS => { "changed": false, "ping": "pong" } larry | SUCCESS => { "changed": false, "ping": "pong" } moe | SUCCESS => { "changed": false, "ping": "pong" }
Ansible имеет много модулей для всех распространенных задач системного администрирования, таких как управление файлами, управление пользователями и пакетами, а также множество необычных задач. Но если вы не можете найти то, что вам нужно, или просто чувствуете себя более комфортно с простыми командами оболочки, вы можете использовать модуль оболочки напрямую, включая каналы. Следующая команда извлекает внутренние и внешние IP-адреса всех хостов:
ansible all -i hosts -m shell -a '/sbin/ifconfig | grep inet.*Bcast'" larry | SUCCESS | rc=0 >> inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 inet addr:192.168.88.10 Bcast:192.168.88.255 Mask:255.255.255.0 curly | SUCCESS | rc=0 >> inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 inet addr:192.168.88.11 Bcast:192.168.88.255 Mask:255.255.255.0 moe | SUCCESS | rc=0 >> inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 inet addr:192.168.88.12 Bcast:192.168.88.255 Mask:255.255.255.0
Playbooks
Специальные команды хороши, когда вы хотите быстро что-то сделать на нескольких хостах, но настоящая сила Ansible в его Playbooks. Playbooks - это файлы YAML, в которых вы определяете наборы задач для достижения таких целей, как подготовка, настройка, развертывание и управление вашей инфраструктурой.
Пример Playbook
Давайте посмотрим на то, как выглядит типичный playbook, прежде чем мы перейдем к деталям.
--- - hosts: funnier tasks: - name: Install Nginx apt: pkg=nginx state=installed update_cache=true notify: Start Nginx - name: Install Python 3 apt: pkg=python3-minimal state=installed handlers: - name: Start Nginx service: name=nginx state=started
В playbook есть раздел hosts, в котором вы указываете хосты из файла инвентаризации. В этом случае название группы "funnier". Затем есть раздел задач с двумя задачами, которые устанавливают Nginx и Python 3. Наконец, есть раздел обработчиков, где Nginx запускается после его установки.
Запуск Playbooks
Вы запускаете playbook с помощью команды ansible-playbook
. Вам все еще нужно предоставить файл инвентаря и книгу воспроизведения, которую вы хотите запустить. Сохраните playbook в файл с именем "playbook.yml" в вашем рабочем каталоге. Давайте попробуем:
ansible-playbook -i hosts playbook.yml PLAY *************************************************************************** TASK [setup] ******************************************************************* ok: [moe] ok: [curly] TASK [Install Nginx] *********************************************************** fatal: [moe]: FAILED! => {"changed": false, "failed": true, "msg": "Failed to lock apt for exclusive operation"} fatal: [curly]: FAILED! => {"changed": false, "failed": true, "msg": "Failed to lock apt for exclusive operation"} PLAY RECAP ********************************************************************* curly : ok=1 changed=0 unreachable=0 failed=1 moe : ok=1 changed=0 unreachable=0 failed=1
О нет. Что случилось? Ansible выдает приличное сообщение об ошибке здесь: «Не удалось заблокировать apt для исключительной операции». Многие playbooks требуют привилегий sudo. Этот playbook не является исключением. Чтобы запустить playbook с правами sudo, просто добавьте флаг --sudo
:
ansible-playbook -i hosts playbook.yml --sudo PLAY *************************************************************************** TASK [setup] ******************************************************************* ok: [curly] ok: [moe] TASK [Install Nginx] *********************************************************** changed: [moe] changed: [curly] TASK [Install Python 3] ******************************************************** changed: [moe] changed: [curly] RUNNING HANDLER [Start Nginx] ************************************************** changed: [moe] changed: [curly] PLAY RECAP ********************************************************************* curly : ok=4 changed=3 unreachable=0 failed=0 moe : ok=4 changed=3 unreachable=0 failed=0
Ansible является идемпотентом, что означает, что если что-то уже находится в желаемом состоянии, то Ansible оставит это в покое. В выводе ansible-playbook
вы можете увидеть, какие задачи были успешными или неудачными, а какие были изменены.
Давайте снова запустим ту же playbook. Ничто не должно быть изменено:
ansible-playbook -i hosts playbook.yml --sudo PLAY *************************************************************************** TASK [setup] ******************************************************************* ok: [moe] ok: [curly] TASK [Install Nginx] *********************************************************** ok: [curly] ok: [moe] TASK [Install Python 3] ******************************************************** ok: [curly] ok: [moe] PLAY RECAP ********************************************************************* curly : ok=3 changed=0 unreachable=0 failed=0 moe : ok=3 changed=0 unreachable=0 failed=0
Стратегии запуска
До Ansible 2.0 playbook выполнялись линейно, задача за задачей. Все целевые хосты выполнили первое задание. Только когда все узлы были выполнены с первым заданием, они могли начать второе задание.
В Ansible 2.0 добавлена концепция стратегий запуска. В настоящее время существует две стратегии: «линейная» стратегия, которую я описал выше, которая является стратегией по умолчанию, и «свободная» стратегия, при которой хосты могут выполнять задачи в сборнике playbook по-прежнему в порядке, но не в стопах с другими хостами.
Это может быть полезно, если сотни хостов должны загрузить несколько файлов с некоторых FTP-серверов. Первый хост может завершить загрузку первого файла и перейти к следующему, в то время как другие хосты все еще заняты загрузкой первого файла. К тому моменту, когда другие хосты загрузят следующий файл, первый хост уже будет готов, и будет меньше конфликтов.
Свободная стратегия кажется превосходной в большинстве ситуаций. Вы просто добавляете strategy: free
пару ключ-значение в playbook.
- hosts: all strategy: free tasks: ...
Блоки
Еще одна новая особенность Ansible 2.0 - блоки. Блоки позволяют группировать задачи вместе. Это очень полезно, если у вас есть задачи, которые нужно выполнять только при определенных условиях. Раньше вам приходилось делать это для каждой задачи отдельно.
--- - hosts: all tasks: - debug: msg='Task 1 here' when: ansible_distribution == 'Ubuntu' - debug: msg='Task 2 here' when: ansible_distribution == 'Ubuntu' - debug: msg='Task 3 here' when: ansible_distribution == 'Ubuntu'
С блоками вы можете сгруппировать все эти задачи отладки и поставить условие « when» на уровне блока.
- hosts: all tasks: - block: - debug: msg='Task 1 here' - debug: msg='Task 2 here' - debug: msg='Task 3 here' when: ansible_distribution == 'Ubuntu'
Хранилище
Ansible связывается с удаленными компьютерами по SSH, но в плейбуках могут содержаться такие секреты, как имя пользователя, пароли и ключи API. Поскольку вы обычно храните playbooks в системах контроля версий, таких как git, эта информация будет видна всем, кто имеет доступ для чтения.
Ansible помогает с программой ansible-vault, которая позволяет создавать, редактировать и повторно шифровать зашифрованные файлы. Эти файлы могут быть расшифрованы на лету при запуске playbook, указав пароль. Если вы добавите флаг --vault-ask-pass
в ansible-playbook, он запросит пароль хранилища.
Кроме того, вы можете добавить --vault-password-file <файл-пароля>
, и Ansible прочитает пароль из вашего файла. Если вы используете файл паролей, не храните его в системе контроля версий!
Теперь вы можете безопасно хранить зашифрованные файлы в системе контроля версий и не беспокоиться о том, что кто-то найдет ваши секреты. Вам нужно тщательно управлять своим паролем хранилища. Если вы потеряете его, вы не сможете расшифровать файлы в хранилище.
Заключение
Ansible - отличный инструмент. Это легкий. Он может использоваться в интерактивном режиме со специальными командами и очень хорошо масштабируется для больших систем. У него также есть большой импульс и большое сообщество. Если вы управляете или даже просто работаете с удаленными серверами, вам определенно нужен Ansible.
Оставайтесь с нами для второй части.
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weeklyEnvato Tuts+ tutorials are translated into other languages by our community members—you can be involved too!
Translate this post