Как использовать Ansible: справочное руководство

Введение

Ansible – это современный инструмент управления конфигурацией, который облегчает задачу настройки и поддержки удаленных серверов.

Этот шпаргалка-подобный гид предоставляет быстрый справочник по командам и практикам, часто используемым при работе с Ansible. Для обзора Ansible и инструкций по установке и настройке см. наш руководство по Как установить и настроить Ansible на Ubuntu 20.04.

Как использовать этот гид:

  • Этот гид выполнен в формате шпаргалки с самостоятельными фрагментами командной строки.
  • Переходите к любому разделу, который актуален для задачи, которую вы пытаетесь выполнить.
  • Когда вы видите выделенный текст в командах этого руководства, имейте в виду, что этот текст должен ссылаться на хосты, имена пользователей и IP-адреса из вашего собственного инвентаря.

Глоссарий Ansible

В этом руководстве часто используются следующие специфические термины Ansible:

  • Управляющая Машина / Узел: система, где установлен и настроен Ansible для подключения и выполнения команд на узлах.
  • Узел: сервер, управляемый Ansible.
  • Файл инвентаря: файл, содержащий информацию о серверах, которыми управляет Ansible, обычно находится по пути /etc/ansible/hosts.
  • Плейбук: файл, содержащий серию задач для выполнения на удаленном сервере.
  • Роль: набор плейбуков и других файлов, которые относятся к определенной цели, такой как установка веб-сервера.
  • Игра: полный запуск Ansible. У игры может быть несколько плейбуков и ролей, включенных из одного плейбука, который выступает в качестве точки входа.

Если вам нужен пример использования этих команд на практике, ознакомьтесь с нашим руководством по Как использовать Ansible для автоматизации начальной настройки сервера на Ubuntu 20.04. Вам понадобится как минимум один удаленный сервер для использования в качестве узла.

Тестирование подключения к узлам

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

  1. ansible all -m ping

Модуль ping проверит, имеете ли вы действительные учетные данные для подключения к узлам, определенным в вашем файле инвентаря, а также проверит, может ли Ansible выполнять сценарии на Python на удаленном сервере. Ответ pong означает, что Ansible готов к выполнению команд и плейбуков на этом узле.

Подключение в качестве другого пользователя

По умолчанию Ansible пытается подключиться к узлам от имени текущего пользователя системы, используя соответствующую пару ключей SSH. Чтобы подключиться в качестве другого пользователя, добавьте к команде флаг -u и имя желаемого пользователя:

  1. ansible all -m ping -u sammy

То же самое действительно и для ansible-playbook:

  1. ansible-playbook myplaybook.yml -u sammy

Использование пользовательского ключа SSH

Если вы используете пользовательский ключ SSH для подключения к удаленным серверам, вы можете указать его при выполнении команды с помощью опции --private-key:

  1. ansible all -m ping --private-key=~/.ssh/custom_id

Эта опция также действительна для ansible-playbook:

  1. ansible-playbook myplaybook.yml --private-key=~/.ssh/custom_id

Использование аутентификации на основе пароля

Если вам необходимо использовать аутентификацию на основе пароля для подключения к узлам, вы должны добавить опцию --ask-pass к вашей команде Ansible.

Это заставит Ansible запросить у вас пароль пользователя на удаленном сервере, от имени которого вы пытаетесь подключиться:

  1. ansible all -m ping --ask-pass

Этот вариант также действителен для ansible-playbook:

  1. ansible-playbook myplaybook.yml --ask-pass

Предоставление пароля sudo

Если удаленному пользователю необходимо предоставить пароль для выполнения команд sudo, вы можете включить опцию --ask-become-pass в вашу команду Ansible. Это попросит вас предоставить пароль для sudo удаленного пользователя:

  1. ansible all -m ping --ask-become-pass

Этот вариант также действителен для ansible-playbook:

  1. ansible-playbook myplaybook.yml --ask-become-pass

Использование пользовательского файла инвентаря

Файл инвентаря по умолчанию обычно находится в /etc/ansible/hosts, но вы также можете использовать опцию -i для указания пользовательских файлов инвентаря при запуске команд и playbooks Ansible. Ansible также поддерживает скрипты инвентаря для создания динамических файлов инвентаря, когда ваш инвентарь изменяется, с частым созданием и уничтожением серверов. Пользовательские файлы инвентаря полезны для настройки инвентарей для каждого проекта, которые можно включить в системы контроля версий, такие как Git:

  1. ansible all -m ping -i my_custom_inventory

Та же опция действительна для ansible-playbook:

  1. ansible-playbook myplaybook.yml -i my_custom_inventory

Запуск временных команд

Чтобы выполнить команду на узле, используйте опцию , за которой следует команда, которую вы хотите выполнить, в кавычках.

Это выполнит uname -a на всех узлах в вашем инвентаре:

  1. ansible all -a "uname -a"

Также можно выполнять модули Ansible с опцией . Следующая команда установит пакет vim на server1 из вашего инвентаря:

  1. ansible server1 -m apt -a "name=vim"

Перед внесением изменений в ваши узлы вы можете провести пробный запуск, чтобы предсказать, как сервера будут затронуты вашей командой. Это можно сделать, включив опцию --проверка:

  1. ansible server1 -m apt -a "name=vim" --check

Запуск плейбуков

Чтобы запустить плейбук и выполнить все в нем определенные задачи, используйте команду ansible-playbook:

  1. ansible-playbook myplaybook.yml

Чтобы перезаписать опцию hosts по умолчанию в плейбуке и ограничить выполнение определенной группой или хостом, включите опцию -l в вашей команде:

  1. ansible-playbook -l server1 myplaybook.yml

Получение информации о пьесе

Опция --list-tasks используется для перечисления всех задач, которые будут выполнены в рамках пьесы без внесения изменений на удаленных серверах:

  1. ansible-playbook myplaybook.yml --list-tasks

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

  1. ansible-playbook myplaybook.yml --list-hosts

Вы можете использовать теги, чтобы ограничить выполнение пьесы. Чтобы перечислить все доступные теги в пьесе, используйте опцию --list-tags:

  1. ansible-playbook myplaybook.yml --list-tags

Управление выполнением плейбука

Вы можете использовать опцию --start-at-task, чтобы определить новую точку входа для вашего плейбука. Затем Ansible пропустит все, что идет перед указанной задачей, и выполнит оставшуюся часть пьесы с этой точки:

  1. ansible-playbook myplaybook.yml --start-at-task="Set Up Nginx"

Чтобы выполнить только задачи, связанные с определенными тегами, можно использовать опцию --tags. Например, если вы хотите выполнить только задачи с тегами nginx или mysql, вы можете использовать:

  1. ansible-playbook myplaybook.yml --tags=mysql,nginx

Если вы хотите пропустить все задачи, которые находятся под определенными тегами, используйте --skip-tags. Следующая команда выполнит myplaybook.yml, пропуская все задачи, помеченные как mysql:

  1. ansible-playbook myplaybook.yml --skip-tags=mysql

Использование Ansible Vault для хранения конфиденциальных данных

Если ваши плейбуки Ansible работают с конфиденциальными данными, такими как пароли, ключи API и учетные данные, важно сохранить эти данные в безопасности, используя механизм шифрования. Ansible предоставляет ansible-vault для шифрования файлов и переменных.

Хотя можно зашифровать любой файл данных Ansible, а также двоичные файлы, чаще всего используется ansible-vault для шифрования файлов переменных, содержащих конфиденциальные данные. После шифрования файла с помощью этого инструмента вы сможете выполнять, редактировать или просматривать его содержимое, указав соответствующий пароль, определенный при первоначальном шифровании файла.

Создание нового зашифрованного файла

Вы можете создать новый зашифрованный файл Ansible с помощью:

  1. ansible-vault create credentials.yml

Эта команда выполнит следующие действия:

  • Сначала вас попросят ввести новый пароль. Вам нужно будет предоставить этот пароль всякий раз, когда вы получаете доступ к содержимому файла, будь то для редактирования, просмотра или просто выполнения playbooks или команд с использованием этих значений.
  • Затем будет открыт ваш редактор командной строки по умолчанию, чтобы вы могли заполнить файл нужным содержимым.
  • Наконец, когда вы закончите редактирование, ansible-vault сохранит файл как зашифрованные данные.

Шифрование существующего файла Ansible

Чтобы зашифровать существующий файл Ansible, вы можете использовать следующий синтаксис:

  1. ansible-vault encrypt credentials.yml

Это попросит вас ввести пароль, который вам нужно будет вводить каждый раз, когда вы получаете доступ к файлу credentials.yml.

Просмотр содержимого зашифрованного файла

Если вы хотите просмотреть содержимое файла, который был ранее зашифрован с помощью ansible-vault, и вам не нужно изменять его содержимое, вы можете использовать:

  1. ansible-vault view credentials.yml

Это попросит вас ввести пароль, который вы выбрали при первоначальном шифровании файла с помощью ansible-vault.

Редактирование зашифрованного файла

Для редактирования содержимого файла, который ранее был зашифрован с помощью Ansible Vault, выполните следующее:

  1. ansible-vault edit credentials.yml

Это позволит вам ввести пароль, который вы выбрали при первоначальном шифровании файла credentials.yml с помощью ansible-vault. После проверки пароля ваш редактор командной строки по умолчанию откроется с расшифрованным содержимым файла, позволяя вам вносить изменения. По завершении вы можете сохранить и закрыть файл как обычно, и обновленное содержимое будет сохранено как зашифрованные данные.

Расшифровка зашифрованных файлов

Если вы хотите окончательно вернуть файл, который ранее был зашифрован с помощью ansible-vault, к его расшифрованной версии, вы можете сделать это с помощью этого синтаксиса:

  1. ansible-vault decrypt credentials.yml

Это позволит вам ввести тот же пароль, который использовался при первоначальном шифровании файла credentials.yml с помощью ansible-vault. После проверки пароля содержимое файла будет сохранено на диске как незашифрованные данные.

Использование нескольких паролей для хранилищ

Ansible поддерживает несколько паролей для хранилищ, сгруппированных по разным идентификаторам хранилищ. Это полезно, если вы хотите иметь отдельные пароли для разных сред, таких как среды разработки, тестирования и производства.

Для создания нового зашифрованного файла с использованием пользовательского идентификатора хранилища, укажите опцию --vault-id вместе с меткой и местоположением, где ansible-vault может найти пароль для этого хранилища. Метка может быть любым идентификатором, а местоположение может быть либо prompt, что означает, что команда должна запросить вас ввести пароль, либо допустимым путем к файлу пароля.

  1. ansible-vault create --vault-id dev@prompt credentials_dev.yml

Это создаст новый идентификатор хранилища с именем dev, который использует prompt в качестве источника пароля. Комбинируя этот метод с файлами переменных группы, вы сможете иметь отдельные хранилища ansible для каждой среды приложения:

  1. ansible-vault create --vault-id prod@prompt credentials_prod.yml

Мы использовали dev и prod в качестве идентификаторов хранилища, чтобы продемонстрировать, как можно создавать отдельные хранилища для каждой среды, но вы можете создавать столько хранилищ, сколько захотите, и использовать любой идентификатор по вашему выбору в качестве идентификатора хранилища.

Теперь для просмотра, редактирования или расшифровки этих файлов вам нужно будет предоставить тот же идентификатор хранилища и источник пароля вместе с командой ansible-vault:

  1. ansible-vault edit credentials_dev.yml --vault-id dev@prompt

Использование файла пароля

Если вам нужно автоматизировать процесс предоставления серверов с использованием Ansible с помощью стороннего инструмента, вам потребуется способ предоставить пароль от хранилища без запроса его. Это можно сделать, используя файл пароля с помощью ansible-vault.

A password file can be a plain text file or an executable script. If the file is an executable script, the output produced by this script will be used as the vault password. Otherwise, the raw contents of the file will be used as vault password.

Чтобы использовать файл пароля с ansible-vault, вам нужно указать путь к файлу пароля при выполнении любых из команд vault:

  1. ansible-vault create --vault-id dev@path/to/passfile credentials_dev.yml

Ansible не делает различий между содержимым, зашифрованным с использованием prompt или файла пароля в качестве источника пароля, при условии, что введенный пароль одинаков. Практически это означает, что можно зашифровать файл, используя prompt, а затем позже использовать файл пароля для хранения того же пароля, который использовался с методом prompt. Обратное также верно: можно зашифровать содержимое с использованием файла пароля, а затем использовать метод prompt, предоставив тот же пароль при запросе Ansible.

Для расширенной гибкости и безопасности вместо хранения пароля от вашего хранилища в файле обычного текста можно использовать сценарий Python для получения пароля из других источников. В официальном репозитории Ansible содержатся несколько примеров сценариев хранилища, которые можно использовать в качестве справки при создании собственного сценария, который подходит для конкретных потребностей вашего проекта.

Запуск Playbook с данными, зашифрованными с помощью Ansible Vault

Всякий раз, когда вы запускаете playbook, который использует ранее зашифрованные данные с помощью ansible-vault, вам нужно будет предоставить пароль к хранилищу вашей команде playbook.

Если вы использовали параметры по умолчанию и источник пароля prompt при шифровании данных, используемых в этом playbook, вы можете использовать параметр --ask-vault-pass, чтобы Ansible запросил пароль у вас:

  1. ansible-playbook myplaybook.yml --ask-vault-pass

Если вы использовали файл пароля вместо запроса пароля, вы должны использовать параметр --vault-password-file вместо этого:

  1. ansible-playbook myplaybook.yml --vault-password-file my_vault_password.py

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

  1. ansible-playbook myplaybook.yml --vault-id dev@prompt

Если вы используете файл пароля с вашим идентификатором хранилища, вы должны предоставить метку, за которой следует полный путь к файлу пароля в качестве источника пароля:

  1. ansible-playbook myplaybook.yml --vault-id dev@vault_password.py

Если ваш play использует несколько хранилищ, вы должны предоставить параметр --vault-id для каждого из них, в произвольном порядке:

  1. ansible-playbook myplaybook.yml --vault-id dev@vault_password.py --vault-id test@prompt --vault-id ci@prompt

Отладка

Если вы столкнулись с ошибками при выполнении команд и плейбуков Ansible, рекомендуется увеличить уровень подробности вывода, чтобы получить больше информации о проблеме. Вы можете сделать это, добавив опцию -v к команде:

  1. ansible-playbook myplaybook.yml -v

Если вам нужна более подробная информация, вы можете использовать -vvv, это увеличит подробности вывода. Если вы не можете подключиться к удаленным узлам через Ansible, используйте -vvvv, чтобы получить отладочную информацию о подключении:

  1. ansible-playbook myplaybook.yml -vvvv

Заключение

Это руководство охватывает некоторые из наиболее распространенных команд Ansible, которые вы можете использовать при настройке серверов, такие как выполнение удаленных команд на ваших узлах и запуск плейбуков с использованием различных пользовательских параметров.

Существуют другие варианты команд и флагов, которые вы можете найти полезными для вашего рабочего процесса Ansible. Чтобы получить обзор всех доступных опций, вы можете использовать команду help:

  1. ansible --help

Если вы хотите получить более полное представление о Ansible и всех его доступных командах и функциях, обратитесь к официальной документации Ansible.

Если вы хотите увидеть еще один практический пример использования Ansible, ознакомьтесь с нашим руководством Как использовать Ansible для установки и настройки Docker на Ubuntu 20.04.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-ansible-cheat-sheet-guide