Ansible playbook удалить файл
Ansible – это современный инструмент управления конфигурацией, который облегчает задачу настройки и обслуживания удаленных серверов.
Этот мануал написан в виде шпаргалки. По сути это краткий справочник по командам и методам, обычно используемым при работе с Ansible. Краткий обзор Ansible и инструкции по установке и настройке вы найдете в руководстве Установка и настройка Ansible в Ubuntu 18.04.
Как пользоваться этим мануалом:
- Найдите раздел, который описывает интересующую вас задачу.
- Выделенный текст в командах – условные данные, которые нужно заменить своими данными. Обычно это хосты, имена пользователей и IP-адреса из вашего инвентаря.
Краткий словарь терминов Ansible
В этом руководстве широко используются такие термины Ansible:
- Control Machine (или Node): ведущая система, в которой установлен Ansible и откуда он может подключаться к нодам и выполнять на них команды.
- Нода: сервер, управляемый Ansible.
- Файл инвентаря: файл, который содержит информацию о серверах, которыми управляет Ansible, обычно находится в /etc/ansible/hosts.
- Плейбук (Playbook): файл, содержащий серию задач, которые нужно выполнить на удаленном сервере.
- Роль: коллекция плейбуков и других файлов, которые имеют отношение к цели (например, к установке веб-сервера).
- Play: полный набор инструкций Ansible. В play может быть несколько плейбуков и ролей, включенных в один плейбук, который служит точкой входа.
Проверка подключения к нодам
Чтобы убедиться, что Ansible может подключаться к нодам и запускать команды и плейбуки, вы можете использовать следующую команду:
ansible all -m ping
Модуль ping проверит, есть ли у вас валидные учетные данные для подключения к нодам, определенным в файле инвентаря, и может ли Ansible запускать сценарии Python на удаленном сервере. Ответ pong означает, что Ansible готов запускать команды и плейбуки на этой ноде.
Подключение с помощью другого пользователя
По умолчанию Ansible пытается подключиться к нодам в качестве текущего пользователя системы через соответствующую пару ключей SSH. Чтобы подключиться как другой пользователь, добавьте команду с флагом -u и именем нового пользователя:
ansible all -m ping -u disnetern
То же самое относится и к ansible-playbook:
ansible-playbook myplaybook.yml -u disnetern
Настройка пользовательского ключа SSH
Если вы используете свой ключ SSH для подключения к удаленным серверам, вы можете предоставить его с помощью параметра –private-key:
ansible all -m ping --private-key=
Эта опция также работает для ansible-playbook:
ansible-playbook myplaybook.yml --private-key=
Настойка парольной аутентификации
Если вам нужно использовать парольную аутентификацию для подключения к нодам, добавьте опцию –ask-pass к команде Ansible.
Это заставит Ansible запросить у вас пароль пользователя на удаленном сервере, к которому вы пытаетесь подключиться:
ansible all -m ping --ask-pass
Эта опция также действительна для ansible-playbook:
ansible-playbook myplaybook.yml --ask-pass
Использование пароля sudo
Если удаленный пользователь должен предоставить пароль для запуска команд sudo, вы можете включить опцию –ask-become-pass в команду Ansible. Опция позволит вам ввести пароль sudo удаленного пользователя:
ansible all -m ping --ask-become-pass
Эта опция также действительна для ansible-playbook:
ansible-playbook myplaybook.yml --ask-become-pass
Пользовательский файл инвентаря
Файл инвентаря по умолчанию обычно находится в /etc/ansible/hosts, но вы можете использовать опцию -i для указания пользовательских файлов при запуске команд и плейбуков Ansible. Это удобный способ настройки индивидуального инвентаря для каждого проекта, который можно включить в системы контроля версий, такие как Git:
ansible all -m ping -i my_custom_inventory
Такая опция действительна и для ansible-playbook:
ansible-playbook myplaybook.yml -i my_custom_inventory
Динамический файл инвентаря
Ansible поддерживает сценарии инвентаризации для создания динамических файлов. Это полезно, если ваш инвентарь часто меняется, когда серверы создаются и уничтожаются.
Вы можете найти ряд скриптов с открытым исходным кодом в официальном репозитории Ansible GitHub. После загрузки требуемого сценария на Ansible control machine и настройки необходимых параметров (например, учетных данных API) вы можете запустить исполняемый файл в качестве пользовательского инвентаря с любой командой Ansible, которая поддерживает эту опцию.
Следующая команда использует скрипт инвентаря my_inventory.py с командой ping для проверки подключения ко всем текущим активным серверам:
ansible all -m ping -i my_inventory.py
За более подробной информацией о том, как использовать динамические файлы инвентаризации, пожалуйста, обратитесь к официальной документации Ansible.
Запуск специальных команд
Чтобы выполнить любую команду на ноде, используйте параметр -a, а затем укажите нужную команду в кавычках.
Например, следующая команда выполнит uname -a на всех нодах в вашем инвентаре:
ansible all -a "uname -a"
Также с помощью опции -m можно запускать модули Ansible. Следующая команда установит пакет vim на server1 из вашего инвентаря:
ansible server1 -m apt -a "name=vim"
Прежде чем вносить изменения на свои ноды, вы можете выполнить пробный прогон, чтобы увидеть, как ваша команда повлияет на серверы. Это можно сделать, включив параметр –check:
ansible server1 -m apt -a "name=vim" --check
Запуск плейбуков
Чтобы запустить плейбук и выполнить все определенные в нем задачи, используйте команду ansible-playbook:
Чтобы перезаписать в плейбуке опцию hosts по умолчанию и ограничить выполнение определенной группой или хостом, включите в команду опцию -l:
ansible-playbook -l server1 myplaybook.yml
Запрос информации о play
Опция –list-tasks используется для перечисления всех задач, которые будут выполнены в play, при этом не внося никаких изменений на удаленные серверы:
ansible-playbook myplaybook.yml --list-tasks
Точно так же можно запросить все хосты, которые будут затронуты выполнением play, без запуска каких-либо задач на удаленных серверах:
ansible-playbook myplaybook.yml --list-hosts
Вы можете использовать теги, чтобы ограничить выполнение play. Чтобы вывести список всех тегов, доступных в play, используйте параметр –list-tags:
ansible-playbook myplaybook.yml --list-tags
Управление выполнением плейбука
Вы можете использовать опцию –start-at-task, чтобы определить новую точку входа вашего плейбука. Затем Ansible пропустит все, что предшествует указанной задаче, выполнив оставшуюся часть play с заданного момента. Эта опция в качестве аргумента требует правильное имя задачи:
ansible-playbook myplaybook.yml --start-at-task="Set Up Nginx"
Чтобы выполнять только задачи, связанные с конкретными тегами, вы можете использовать опцию –tags. Например, если вы хотите выполнить только задачи, помеченные как nginx или mysql, вы можете использовать:
ansible-playbook myplaybook.yml --tags=mysql,nginx
Если вы хотите пропустить все задачи, которые находятся под определенными тегами, используйте –skip-tags. Следующая команда будет выполнять myplaybook.yml, пропуская все задачи, помеченные как mysql:
ansible-playbook myplaybook.yml --skip-tags=mysql
Ansible Vault для хранения конфиденциальных данных
Если ваши плейбуки Ansible содержат конфиденциальные данные, такие как пароли, ключи API и учетные данные, важно обеспечить их безопасность с помощью шифрования. Ansible предоставляет ansible-vault для шифрования файлов и переменных.
Несмотря на то, что любой файл данных Ansible, а также двоичные файлы, возможно зашифровать изначально, чаще для шифрования переменных файлов, содержащих конфиденциальные данные, используется ansible-vault. После шифрования файла с помощью этого инструмента вы сможете выполнять, редактировать или просматривать его, только предоставив соответствующий пароль, указанный при первом шифровании файла.
Создание нового зашифрованного файла
Вы можете создать новый зашифрованный файл Ansible с помощью:
ansible-vault create credentials.yml
Эта команда выполнит следующие действия:
- Сначала вам будет предложено ввести новый пароль. Вам нужно будет указывать этот пароль при каждом доступе к содержимому файла, будь то редактирование, просмотр или просто запуск плейбука (или команд с использованием его значений).
- Затем откроется редактор командной строки по умолчанию, чтобы вы могли заполнить файл требуемым содержимым.
- Наконец, когда вы закончите редактирование, ansible-vault сохранит файл как зашифрованный.
Шифрование существующего файла Ansible
Чтобы зашифровать существующий файл Ansible, вы можете использовать следующую команду:
ansible-vault encrypt credentials.yml
Эта команда запросит у вас пароль, который вам нужно будет вводить при каждом доступе к файлу credentials.yml.
Просмотр содержимого зашифрованного файла
Если вы хотите просмотреть содержимое файла, который ранее был зашифрован с помощью ansible-vault, и вам не нужно изменять его содержимое, вы можете использовать команду:
ansible-vault view credentials.yml
Она предложит вам указать пароль, который вы выбрали при первом шифровании файла с помощью ansible-vault.
Редактирование зашифрованного файла
Чтобы изменить содержимое файла, который ранее был зашифрован с помощью Ansible Vault, выполните:
ansible-vault edit credentials.yml
Эта команда предложит вам указать пароль, который вы выбрали при первом шифровании файла credentials.yml. После проверки пароля откроется редактор командной строки по умолчанию с незашифрованным содержимым файла, что позволит вам внести нужные изменения. По завершении вы можете сохранить и закрыть файл, как обычно, и обновленное содержимое будет сохранено и зашифровано.
Расшифровка файлов
Если вы хотите навсегда расшифровать файл, ранее зашифрованный с помощью ansible-vault, вы можете сделать это с помощью следующего синтаксиса:
ansible-vault decrypt credentials.yml
Эта команда предложит вам ввести тот пароль, который использовался при первом шифровании файла. После проверки пароля содержимое файла будет сохранено на диск в виде незашифрованных данных.
Использование нескольких паролей
Ansible поддерживает для хранилища несколько паролей, сгруппированных по разным идентификаторам. Это полезно, если вы хотите иметь выделенные пароли хранилища для различных сред – для разработки, тестирования и производства.
Чтобы создать новый зашифрованный файл с пользовательским идентификатором хранилища, включите параметр –vault-id вместе с меткой и расположением, где ansible-vault может найти пароль для этого хранилища. Метка может быть любой, а расположение может быть либо prompt (что означает, что команда должна предложить вам ввести пароль), либо путь к файлу паролей.
ansible-vault create --vault-id dev@prompt credentials_dev.yml
Это создаст новый идентификатор по имени dev, который использует prompt для получения пароля. Комбинируя этот метод с файлами переменных группы, вы сможете создать отдельные хранилища для каждой среды приложения:
ansible-vault create --vault-id prod@prompt credentials_prod.yml
Мы использовали dev и prod в качестве идентификаторов хранилищ, чтобы продемонстрировать, как вы можете создавать отдельные хранилища для каждой среды. Самостоятельно вы можете создать столько хранилищ, сколько захотите, и использовать любой ID.
Теперь, чтобы просмотреть, отредактировать или расшифровать эти файлы, вам необходимо предоставить тот же ID хранилища и источник пароля вместе с командой ansible-vault:
ansible-vault edit credentials_dev.yml --vault-id dev@prompt
Использование файла паролей
Если вам нужно автоматизировать процесс инициализации серверов в Ansible с помощью стороннего инструмента, вам потребуется способ ввода пароля хранилища без его запроса. Вы можете сделать это, используя файл паролей через ansible-vault.
Файл паролей может быть простым текстовым файлом или исполняемым скриптом. Если файл является исполняемым, выходные данные, созданные ним, будут использоваться в качестве пароля хранилища. В противном случае в качестве пароля хранилища будет использоваться необработанное содержимое файла.
Чтобы применить файл паролей в ansible-vault, необходимо указать путь к файлу паролей при выполнении любой из команд vault:
ansible-vault create --vault-id dev@path/to/passfile credentials_dev.yml
Ansible не различает контент, который был зашифрован с помощью prompt, и простой файл пароля при условии, что входной пароль один и тот же. С практической точки зрения это означает, что файл можно зашифровать, используя prompt, а затем создать файл пароля для хранения того же пароля, который использовался в методе prompt. Также верно и обратное: вы можете зашифровать содержимое, используя файл паролей, а затем использовать метод prompt, предоставляя тот же пароль при запросе Ansible.
Для большей гибкости и безопасности, чтобы не хранить свой пароль в текстовом файле, вы можете использовать скрипт Python для получения пароля из других источников. Официальный репозиторий Ansible содержит несколько примеров сценариев, которые вы можете использовать для справки при создании своего скрипта под потребности вашего проекта.
Запуск плейбука с зашифрованными данными
Каждый раз, когда вы запускаете плейбук, в котором используются данные, ранее зашифрованные с помощью ansible-vault, вам нужно будет указывать пароль хранилища в команде playbook.
Если вы использовали параметры по умолчанию и prompt при шифровании данных плейбука, вы можете использовать опцию –ask-vault-pass, чтобы Ansible запрашивал пароль:
ansible-playbook myplaybook.yml --ask-vault-pass
Если вы использовали файл пароля вместо prompt, вы должны использовать опцию –vault-password-file:
ansible-playbook myplaybook.yml --vault-password-file my_vault_password.py
Если вы используете данные, зашифрованные с помощью ID, вам нужно указать тот же ID хранилища и источник пароля, который вы использовали при первом шифровании данных:
ansible-playbook myplaybook.yml --vault-id dev@prompt
Если вы используете файл пароля с ID, вы должны указать метку, а затем полный путь к файлу пароля в качестве источника:
ansible-playbook myplaybook.yml --vault-id dev@vault_password.py
Если ваш play использует несколько хранилищ, вы должны добавить параметр –vault-id для каждого из них в произвольном порядке:
ansible-playbook myplaybook.yml --vault-id dev@vault_password.py --vault-id test@prompt --vault-id ci@prompt
Устранение неполадок
Если вы сталкиваетесь с ошибками при выполнении команд и плейбуков, рекомендуется увеличить детализацию вывода, чтобы получить больше информации о проблеме. Вы можете сделать это, включив в команду параметр -v:
ansible-playbook myplaybook.yml -v
Если вам нужно больше деталей, вы можете использовать -vvv, и это увеличит детализацию вывода. Если вы не можете подключиться к удаленным нодам через Ansible, используйте -vvvv для получения информации об отладке соединения:
ansible-playbook myplaybook.yml -vvvv
Заключение
В этом мануале рассматриваются наиболее распространенные команды Ansible, которые вы можете использовать при подготовке серверов. Также вы узнали, как удаленно выполнять команды на ваших нодах, как запускать плейбуки и использовать различные пользовательские настройки.
Существует еще много вариантов команд и флагов, которые могут пригодиться вам в работе с Ansible. Чтобы получить обзор всех доступных опций, вы можете использовать команду help:
Если вы хотите получить более полное представление об Ansible и всех его доступных командах и функциях, обратитесь к официальной документации Ansible.
Приведенный ниже код удаляет только первый файл, который он получает внутри веб-каталога. Я хочу удалить все файлы и папки внутри веб-каталога и сохранить веб-каталог. Как я могу это сделать?
Примечание: я пробовал rm -rf используя команду и оболочку, но они не работают. Возможно, я использую их неправильно.
Любая помощь в правильном направлении будет оценена.
Я использую ansible 2.1.0.0
Ниже код удалит все содержимое artifact_path
Примечание: это также приведет к удалению каталога.
Используя модуль оболочки (тоже идемпотент):
Чистое решение, если вас не интересует дата создания и владелец/разрешения:
Удалите каталог (в основном это копия qaru.site/questions/97985/. ), Ansible выполняет эту операцию с rmtree под капотом.
Если у вас нет возможности удалить весь каталог и создать его заново, вы можете отсканировать его на наличие файлов (и каталогов) и удалить их один за другим. Что займет некоторое время. Вы, вероятно, хотите убедиться, что у вас есть [ssh_connection]\npipelining = True в вашем ansible.cfg.
ответил(а) 2017-01-24T22:20:00+03:00 4 года, 10 месяцев назадпопробуйте выполнить команду ниже, она должна работать
Мне действительно не понравилось решение rm, также ansible дает вам предупреждения об использовании rm. Итак, вот как это сделать без необходимости использования rm и без предупреждений.
Использование файла glob также будет работать. В коде, который вы опубликовали, есть синтаксическая ошибка. Я модифицировал и тестировал это должно работать.
Создана общая перестроенная и отказоустойчивая реализация из всех комментариев и предложений:
В связи с этим существует открытый вопрос.
На данный момент решение работает для меня: создать пустую папку локально и синхронизировать ее с удаленной.
Вот пример книги:
Обратите внимание, что при синхронизации вы должны иметь возможность синхронизировать ваши файлы (с удалением) в любом случае.
Я хочу убедиться, что команда find только удаляет все внутри каталога и оставляет каталог нетронутым, потому что в моем случае каталог является файловой системой. Система будет выдавать ошибку при попытке удалить файловую систему, но это не очень хорошая опция. Я использую опцию оболочки, потому что это единственная рабочая опция, которую я нашел до сих пор для этого вопроса.
Отредактируйте файл hosts, добавив некоторые переменные:
И создайте пьесу:
Это удалит все файлы и каталоги в каталоге/файловой системе переменной COGNOS_HOME. Опция "-mindepth 1" гарантирует, что текущий каталог не будет затронут.
Приведенный ниже код удаляет только первый файл, который он получает внутри веб-каталога. Я хочу удалить все файлы и папки внутри веб-каталога и сохранить веб-каталог. Как я могу это сделать?
Примечание: я пытался rm -rf использовать команду и оболочку, но они не работают. Возможно, я использую их неправильно.
Любая помощь в правильном направлении будет оценена.
Я использую ansible 2.1.0.0
Ниже код удалит все содержимое artifact_path
Примечание : это также удалит каталог.
цитаты не обязательны. Это только мой рабочий код. Артефакт_путь похож на / app / my_app / work / ОП (и я) хотим решение, которое удалит содержимое папки, но НЕ саму папку. Это решение удаляет содержимое и саму папку. Кто-нибудь имел приведенный выше код сбоя на них с artifact_path, равным нулю? Такое ощущение, что это может быть восприимчивым к одному из тех великих rm -rf / моментов в истории @ ted-k42 Я бы сделал что-то подобное, чтобы быть в безопасности: when: artifact_path is defined and artifact_path != ""Используя модуль оболочки ( тоже идемпотент ):
Самое чистое решение, если вам не нужны дата создания и владелец / разрешения:
Работает, но не удаляет файлы, начиная с. как .htaccess «Шелл» работал и на меня. Точно такая же задача, но поменялась shell на command и она работает Подстановочные знаки не будут работать с командой, так как для их расширения требуется оболочка Обратите внимание, что это может изменить ваши разрешения / владельца, если вы не установили явно во время создания. Используя оболочку, вы получите предупреждение об использовании файлового модуля с состоянием = отсутствует вместо оболочки rm. Чтобы избежать этого, просто добавьте аргументы: warn: falseЕсли у вас нет возможности удалить весь каталог и создать его заново, вы можете отсканировать его на наличие файлов (и каталогов) и удалить их один за другим. Что займет некоторое время. Вы, вероятно, хотите убедиться, что [ssh_connection]\npipelining = True в вашем ansible.cfg есть.
Первая задача - самое элегантное решение, которое я видел. Обратите внимание на комментарии в других местах о том, что есть длительный запрос на добавление функции state=emptyМне действительно не понравилось решение rm, также ansible дает вам предупреждения об использовании rm. Итак, вот как это сделать без необходимости использования rm и без предупреждений.
попробуйте команду ниже, она должна работать
вы пропустили правильно экранировать последнюю строку с <>, чтобы получить with_items: ">" Опасно использовать ls 'output' для получения имен файлов, потому что он неправильно печатает имена файлов со специальными символами, такими как перевод строки.Создана общая перестроенная и отказоустойчивая реализация из всех комментариев и предложений:
Я думаю, что вы скучаете register по plugin_dir_deleted , верно? Спасибо за указание на это. Я взял этот кусок кода из одной из моих пьес и сделал его более общим с точки зрения именования, но забыл заменить два имени переменных Хороший материал, но я думаю, что состояние в последней задаче должно быть установлено как «каталог», а не «присутствует». Вы должны использовать свой результат статистики, чтобы сохранить права доступа: владелец из pw_name, группа из gr_name и mode из mode. попробовал, owner: dir_to_delete.stat.pw_name, group: dir_to_delete.stat.gr_name mode: dir_to_delete.stat.mode но у меня неИспользование файлового глобуса также будет работать. В опубликованном вами коде есть синтаксическая ошибка. Я изменил и проверил это должно работать.
with_fileglob работает только на локальной машине, а не на удаленной; не правда ли? Кроме того, это не удаляет каталоги, только файлы удаляются.Обратите внимание, что с синхронизацией вы все равно должны иметь возможность правильно синхронизировать ваши файлы (с удалением).
Вот что я придумала:
Во-первых, мы получаем список каталогов с find настройкой
- file_type чтобы any , таким образом , мы бы не пропустить вложенные каталоги и ссылки
- hidden в yes , таким образом , мы не пропустить скрытые файлы
- Кроме того, не устанавливайте recurse в yes , так как это не только не нужно, но может увеличить время выполнения.
Затем мы проходим этот список с помощью file модуля. Его вывод немного многословен, поэтому loop_control.label поможет нам с ограничением вывода (наш совет был здесь ).
Но я обнаружил, что предыдущее решение было несколько медленным, поскольку оно перебирает содержимое, поэтому я пошел с:
- получить свойства каталога с помощью stat
- удалить каталог
- воссоздать каталог с такими же свойствами.
Этого было достаточно для меня, но вы также можете добавить attributes , если хотите.
Существует вопрос открыт связи с этим .
Пока решение работает для меня: создайте пустую папку локально и синхронизируйте ее с удаленной.
Вот пример игры:
Я написал специальный модуль ANSI для очистки файлов на основе нескольких фильтров, таких как возраст, отметка времени, шаблоны глобусов и т. Д.
Он также совместим с более старыми версиями. Это можно найти здесь .
Я хочу убедиться, что команда find только удаляет все внутри каталога и оставляет каталог нетронутым, потому что в моем случае каталог является файловой системой. Система будет выдавать ошибку при попытке удалить файловую систему, но это не очень хорошая опция. Я использую опцию оболочки, потому что это единственная рабочая опция, которую я нашел до сих пор для этого вопроса.
Отредактируйте файл hosts, добавив некоторые переменные:
И создайте пьесу:
Это удалит все файлы и каталоги в каталоге переменных / файловой системе COGNOS_HOME. Опция -mindepth 1 гарантирует, что текущий каталог не будет затронут.
Если вы используете Ansible> = 2.3, просто маленький шаблон для копирования и вставки из ThorSummoners (различие между файлами и директориями больше не требуется).
Это руководство по стилю шпаргалки содержит краткую справку о командах и методах, обычно используемых при работе с Ansible. Для получения общего представления об Ansible и о том, как его установить и настроить, пожалуйста, ознакомьтесь с нашим руководством по установке и настройке Ansible на Ubuntu 18.04.
Как использовать это руководство:
- Это руководство представлено в формате шпаргалки с автономными фрагментами командной строки.
- Переходите к любому разделу, который имеет отношение к задаче, которую вы пытаетесь выполнить.
- Когда вы видите highlighted text в этом руководстве команды, имейте в виду, что этот текст должен относиться к хостам, именам пользователей и IP-адресам из вашего собственного инвентаря.
Глоссарий
В настоящем руководстве в основном используются следующие специфические для ansible термины:
- Управляющая машина / узел: система, в которой установлен и сконфигурирован Ansible для подключения и выполнения команд на узлах.
- Узел: сервер, управляемый Ansible.
- Файл инвентаризации: файл, содержащий информацию о серверах, на которых обычно находятся элементы управления Ansible /etc/ansible/hosts .
- Playbook: файл, содержащий ряд задач, которые должны быть выполнены на удаленном сервере.
- Роль: коллекция книг воспроизведения и других файлов, имеющих отношение к такой цели, как установка веб-сервера.
- Игра: полный пробег ansible. Пьеса может иметь несколько сборников пьес и ролей, включенных из одного сборника пьес, который действует как точка входа.
Если вы хотите практиковать команды, используемые в этом руководстве, с рабочим учебником Ansible playbook, вы можете использовать этот учебник из нашего руководства по автоматизации начальной настройки сервера с помощью Ansible на Ubuntu 18.04. Вам понадобится по крайней мере один сервер для использования в качестве узла.
Тестирование подключения к узлам
Чтобы проверить, что Ansible может подключать и запускать команды и книги воспроизведения на ваших узлах, вы можете использовать следующую команду:
ping Модуль проверит, есть ли у вас действительные учетные данные для подключения к узлам, определенным в вашем файле инвентаризации, в дополнение к проверке того, может ли Ansible запускать скрипты Python на удаленном сервере. Ответ pong назад означает, что Ansible готов запускать команды и PlayBook на этом узле
Подключение от имени другого пользователя
По умолчанию Ansible пытается подключиться к узлам в качестве текущего системного пользователя, используя соответствующую пару клавиш SSH. Чтобы подключиться как другой пользователь, добавьте команду с
флагом и именем предполагаемого пользователя:
То же самое справедливо и для ansible-playbook:
Использование пользовательского ключа SSH
Если вы используете пользовательский SSH-ключ для подключения к удаленным серверам, вы можете предоставить его во время выполнения с
Эта опция также действительна для ansible-playbook:
Использование аутентификации на основе пароля
Если вам нужно использовать аутентификацию на основе пароля для подключения к узлам, вам нужно добавить эту опцию
к вашей команде Ansible.
Это позволит Ansible запрашивать пароль пользователя на удаленном сервере, к которому вы пытаетесь подключиться в качестве:
Эта опция также действительна для ansible-playbook:
Предоставление sudo пароля
Эта опция также действительна для ansible-playbook :
Использование пользовательского файла инвентаризации
Файл инвентаризации по умолчанию обычно находится по адресу /etc/ansible/hosts , но вы также можете использовать эту -i опцию, чтобы указать на пользовательские файлы инвентаризации при запуске команд Ansible и PlayBook. Это полезно для настройки запасов по каждому проекту, которые могут быть включены в системы контроля версий, такие как Git:
Тот же вариант действителен и для ansible-playbook :
Использование динамического файла инвентаризации
Ansible поддерживает сценарии инвентаризации для построения динамических файлов инвентаризации. Это полезно, если ваш инвентарь колеблется, а серверы часто создаются и уничтожаются.
Вы можете найти несколько сценариев инвентаризации с открытым исходным кодом в официальном репозитории Ansible GitHub. После загрузки нужного скрипта на вашу машину управления Ansible и настройки любой необходимой информации — например, учетных данных API — вы можете использовать исполняемый файл в качестве пользовательского инвентаря с любой командой Ansible, поддерживающей эту опцию.
Следующая команда использует сценарий инвентаризации DigitalOcean от Ansible с ping командой для проверки подключения ко всем текущим активным серверам:
Для получения более подробной информации о том, как использовать динамические файлы инвентаризации, пожалуйста, обратитесь к официальной документации Ansible.
Выполнение специальных команд
Чтобы выполнить команду на узле, используйте -a опцию, за которой следует команда, которую вы хотите запустить, в кавычках.
Это будет выполняться uname -a на всех узлах в вашем инвентаре:
Кроме того, с помощью этой опции можно запускать ansible модули -m . Следующая команда установит пакет vim on server1 из вашего инвентаря:
Прежде чем вносить изменения в узлы, вы можете провести тестовый прогон, чтобы предсказать, как ваша команда повлияет на серверы. Это можно сделать, включив --check опцию:
Запуск Playbook
Чтобы запустить playbook и выполнить все задачи, определенные в нем, используйте ansible-playbook команду:
Чтобы перезаписать параметр hosts по умолчанию в playbook и ограничить выполнение определенной группой или хостом, включите этот параметр -l в свою команду:
Получение информации
Эта опция --list-tasks используется для перечисления всех задач, которые будут выполняться игрой без внесения каких-либо изменений на удаленные серверы:
Точно так же можно перечислить все хосты, которые будут затронуты игрой, не выполняя никаких задач на удаленных серверах:
Вы можете использовать теги, чтобы ограничить выполнение пьесы. Чтобы перечислить все теги, доступные в игре, используйте опцию --list-tags :
Контроль Выполнения Playbook
Вы можете использовать эту опцию --start-at-task , чтобы определить новую точку входа для вашего playbook. Затем Ansible пропустит все, что предшествует указанной задаче, выполнив оставшуюся часть воспроизведения с этого момента. Этот параметр требует допустимого имени задачи в качестве аргумента:
Этот параметр можно использовать только для выполнения задач, связанных с определенными тегами --tags . Например, если вы хотите выполнять только задачи, помеченные как nginx или mysql , вы можете использовать:
Если вы хотите пропустить все задачи, которые находятся под определенными тегами, используйте --skip-tags . Следующая команда будет выполнена myplaybook.yml , пропуская все задачи, помеченные как mysql :
Использование Ansible Vault для хранения конфиденциальных данных
Если ваши Ansible playbook имеют дело с конфиденциальными данными, такими как пароли, ключи API и учетные данные, важно обеспечить безопасность этих данных с помощью механизма шифрования. Ansible обеспечивает ansible-vault шифрование файлов и переменных.
Несмотря на то, что можно зашифровать любой файл данных Ansible, а также двоичные файлы, его чаще всего используют ansible-vault для шифрования переменных файлов, содержащих конфиденциальные данные. После шифрования файла с помощью этого инструмента вы сможете выполнить, отредактировать или просмотреть его содержимое, только предоставив соответствующий пароль, определенный при первом шифровании файла.
Создание нового зашифрованного файла
Вы можете создать новый зашифрованный файл Ansible с помощью:
Эта команда будет выполнять следующие действия:
- Во-первых, он предложит вам ввести новый пароль. Вам нужно будет вводить этот пароль всякий раз, когда вы получаете доступ к содержимому файла, будь то для редактирования, просмотра или просто запуска PlayBook или команд, использующих эти значения.
- Затем он откроет редактор командной строки по умолчанию, чтобы вы могли заполнить файл нужным содержимым.
- Наконец, когда вы закончите редактирование, ansible-vault сохраните файл как зашифрованные данные.
Шифрование существующего файла Ansible
Для шифрования существующего файла Ansible можно использовать следующий синтаксис:
Это запросит у вас пароль, который вам нужно будет вводить всякий раз, когда вы получаете доступ к файлу credentials.yml .
Просмотр содержимого зашифрованного файла
Если вы хотите просмотреть содержимое файла, который ранее был зашифрован, ansible-vault и вам не нужно изменять его содержимое, вы можете использовать:
При этом вам будет предложено ввести пароль, который вы выбрали при первом шифровании файла ansible-vault .
Редактирование зашифрованного файла
Чтобы отредактировать содержимое файла, который ранее был зашифрован с помощью Ansible Vault, выполните команду:
При этом вам будет предложено ввести пароль, который вы выбрали при первом шифровании файла credentials.yml ansible-vault . После проверки пароля откроется редактор командной строки по умолчанию с незашифрованным содержимым файла, что позволит вам внести необходимые изменения. Когда вы закончите, вы можете сохранить и закрыть файл, как обычно, и обновленное содержимое будет сохранено в виде зашифрованных данных.
Расшифровка Зашифрованных Файлов
Если вы хотите навсегда вернуть файл, который ранее был зашифрован, ansible-vault в его незашифрованную версию, вы можете сделать это с помощью этого синтаксиса:
При этом вам будет предложено ввести тот же пароль, который использовался при первом шифровании файла credentials.yml ansible-vault . После проверки пароля содержимое файла будет сохранено на диске в виде незашифрованных данных.
Использование Нескольких Паролей Хранилища
Ansible поддерживает несколько паролей хранилища, сгруппированных по различным идентификаторам хранилища. Это полезно, если вы хотите иметь специальные пароли хранилища для различных сред, таких как среды разработки, тестирования и производства.
Чтобы создать новый зашифрованный файл с помощью пользовательского идентификатора хранилища, включите эту --vault-id опцию вместе с меткой и местоположением, где ansible-vault можно найти пароль для этого хранилища. Метка может быть любым идентификатором , а расположение может быть любым prompt , что означает, что команда должна предложить вам ввести пароль или действительный путь к файлу паролей.
Это создаст новый идентификатор хранилища с именем dev , который будет использоваться prompt в качестве источника пароля. Комбинируя этот метод с файлами групповых переменных, вы сможете иметь отдельные хранилища ansible для каждой среды приложения:
Мы использовали dev и prod в качестве идентификаторов хранилищ, чтобы продемонстрировать, как можно создавать отдельные хранилища для каждой среды, но вы можете создать столько хранилищ, сколько захотите, и вы можете использовать любой идентификатор по вашему выбору в качестве идентификатора хранилища.
Теперь, чтобы просмотреть, отредактировать или расшифровать эти файлы, вам нужно будет предоставить тот же идентификатор хранилища и источник пароля вместе с ansible-vault командой:
Использование файла паролей
Если вам нужно автоматизировать процесс подготовки серверов с помощью Ansible с помощью стороннего инструмента, вам понадобится способ предоставить пароль хранилища без запроса на него. Вы можете сделать это, используя файл пароля ansible-vault С.
Файл пароля может быть обычным текстовым файлом или исполняемым скриптом. Если файл является исполняемым скриптом, то выходные данные, созданные этим скриптом, будут использоваться в качестве пароля хранилища. В противном случае необработанное содержимое файла будет использоваться в качестве пароля хранилища.
Чтобы использовать файл паролей ansible-vault , вам необходимо указать путь к файлу паролей при выполнении любой из команд vault:
Ansible не делает различия между содержимым, которое было зашифровано с помощью prompt файла паролей или файла паролей в качестве источника паролей, если входной пароль один и тот же. На практике это означает, что можно зашифровать файл с помощью prompt , а затем использовать файл пароля для хранения того же пароля, который используется с этим prompt методом. Верно и обратное: вы можете зашифровать содержимое с помощью файла паролей, а затем использовать этот prompt метод, предоставляя тот же пароль по запросу Ansible.
Для большей гибкости и безопасности вместо того, чтобы хранить пароль хранилища в обычном текстовом файле, вы можете использовать скрипт Python для получения пароля из других источников. Официальный репозиторий Ansible содержит несколько примеров сценариев хранилища, которые можно использовать для справки при создании пользовательского сценария, соответствующего конкретным потребностям вашего проекта.
Запуск Playbook с данными, зашифрованными через Ansible Vault
Всякий раз когда вы запускаете playbook, который использует данные, ранее зашифрованные через ansible-vault , вам нужно будет предоставить пароль хранилища для вашей команды playbook.
Если вы использовали параметры по умолчанию и prompt источник пароля при шифровании данных, используемых в этом сборнике воспроизведения, вы можете использовать этот параметр --ask-vault-pass , чтобы сделать Ansible запрос пароля:
Если вы использовали файл пароля вместо запроса пароля, то вам следует использовать эту опцию --vault-password-file :
Если вы используете данные, зашифрованные под идентификатором хранилища, вам нужно будет предоставить тот же идентификатор хранилища и источник пароля, который вы использовали при первом шифровании данных:
Если вы используете файл паролей с вашим идентификатором хранилища, вы должны указать метку, а затем полный путь к файлу паролей в качестве источника паролей:
Если ваша игра использует несколько хранилищ, вы должны указать --vault-id параметр для каждого из них, не в определенном порядке:
Отладка
Если вы столкнулись с ошибками при выполнении команд Ansible и PlayBook, это хорошая идея, чтобы увеличить детализацию вывода, чтобы получить больше информации о проблеме. Вы можете сделать это, включив -v опцию в команду:
Если вам нужно больше деталей, вы можете использовать -vvv , и это увеличит многословность вывода. Если вы не можете подключиться к удаленным узлам через Ansible, используйте -vvvv для получения информации об отладке соединения:
Вывод
В этом руководстве рассматриваются некоторые наиболее распространенные команды Ansible, которые можно использовать при подготовке серверов, например, как выполнять удаленные команды на узлах и как запускать PlayBook с использованием различных пользовательских настроек.
Существуют и другие варианты команд и флаги, которые могут оказаться полезными для вашего рабочего процесса Ansible. Чтобы получить обзор всех доступных опций, можно воспользоваться командой help:
Инструкция представляет из себя шпаргалку по работе с Ansible. У автора не стоит задачи подробного пояснения всех операций — только описание задачи и пример того, как ее можно решить с помощью ansible. Для более подробного описания я постараюсь указать ссылки на официальную документацию. Также в данную шпаргалку не войдут все возможные действия, которые можно выполнить с помощью данной системы — только популярные и те, с которыми приходилось сталкиваться самому автору. По мере возможности, их список будет пополняться.
Для удобства, мы попробуем разбить примеры на операции, которые логически можно объединить в одну группу.
Получение информации
Сюда войдут примеры, которые позволят собирать информацию, выводить ее на экран, помогать в отладке и всякое такое.
1. Показать информацию об удаленной системе, на которой запускается ansible.
Выполняется с помощью модуля debug, который должен показать содержимое ansible_facts:
- name: Print all available facts
ansible.builtin.debug:
var: ansible_facts* ansible_facts содержит массив данных с информацией о системе. Однако, функция сборки информации может быть отключена (так как на ее работу тратится, относительно, много времени) в настройках плейбука с помощью опции gather_facts: false — в этом случае, значение нужно изменить на true.
Также мы можем обратиться к конкретному элементу массива ansible_facts, получив информацию о конкретной настройке или опции:
* например, имя компьютера.
2. Отображение на экран переменной.
Выше мы уже использовали debug для отображения переменной — принцип тот же:
* при выполнении задачи на экране мы увидим значение переменной variable. Обратите внимание, что запись ansible.builtin.debug и debug — это одно и то же, то есть, ansible.builtin можно не писать.
3. Сохранение результата в переменную.
Выполняется с помощью register:
- name: Run a shell command and register its output as a variable
shell: command
register: command_result* в данном примере мы запишем в переменную command_result все то, что мы получили с помощью команды command.
Вывести на экран содержимое можно с помощью debug:
- name: Show Value of Variable
debug:
var: command_result.stdout* обратите внимание, что мы выводим не все содержимое, а только stdout, то есть то, что должна была вывести в консоль команда.
4. Получить список сервисов.
Для этого существует service_facts:
- name: Populate service facts
ansible.builtin.service_facts:- name: Print all available facts
ansible.builtin.debug:
var: ansible_facts.services* цель достигается двумя задачами. В первой мы собираем информацию о сервисах с помощью service_facts, второй — выводим на экран содержимое.
Проверки и условия
В данную группу войдут действия, которые помогут нам ограничить выполнение задач.
1. Проверка на пустую папку.
Задачи сводится к двум операциям:
- получении списка файлов в целевом каталоге (например, с помощью команды ls) и регистрации полученного значения в переменную с помощью register.
- проверка содержимого переменной, которую мы получили на шаге 1 с помощью when.
Пример будет таким:
- name: Register Contents of PGDATA Folder
shell: ls /var/lib/postgresql/11/main
register: pg_contents- name: Init PostgreSQL DB
shell: /opt/pgpro/std-11/bin/pg-setup initdb
environment:
PGDATA: "/var/lib/postgresql/11/main"
when: pg_contents["stdout_lines"] | length == 02. Проверить, определена ли переменная.
Для этого используется опция is defined (определена) или is not defined (не определена):
when: pgpro is defined
when: pgpro is not defined
* в данном примере мы проверим наличие переменной pgpro. На практике такая проверка имеет значение, так как если мы попробуем выполнить действия с несуществующей переменной, Ansible нам вернет ошибку.
В официальной документации про это сказано в статье о when (ссылка выше).
3. Выполнение команды, если сервис в рабочем состоянии.
Нам необходимо получить информацию о службах с помощью service_facts, после чего можно уже делать проверку с помощью when:
- name: Populate service facts
ansible.builtin.service_facts:- name: Stop Service If Running One
shell: systemctl stop apache2
when: ansible_facts.services["apache2.service"] is defined and ansible_facts.services["apache2.service"].state == "running"* в данном примере мы проверим, есть ли служба apache2 и запущена ли она. Если это так, то мы ее останавливаем.
Подробнее о service_facts можно прочитать в документации (ссылка выше в разделе 4. Получить список сервисов).
Установки пакетов, модулей и расширений
В данном разделе мы коснемся всего, что приводит к установке чего бы то ни было. А именно:
- Установки пакетов в систему.
- Загрузки исходников.
- Установке дополнительных модулей.
- Распаковке архивов.
Рассмотрим это подробнее.
1. Установка модуля в nodejs.
Установка модулей в nodejs выполняется с помощью npm. Для него в ansible есть отдельная функция:
- name: Install nodejs modules.
npm:
name: newman
global: yes* в данном примере будет выполнена установка newman, которая будет доступна всем проектам (опция global).
2. Загрузка из GIT.
Выполняется с помощью модуля git:
* в данном примере мы сделаем клон репозитория в каталог /tmp/docker-compose.
3. Распаковка архива.
Выполняется с помощью unarchive:
* в данном примере мы распакуем исходник для nginx в каталог /tmp. Обратите внимание на две вещи:
- Мы используем переменную nginx_ver. Данная переменная должна быть определена при запуске плейбука, или в инвентарном файле, или в var, или в default.
- Опция creates позволит не выполнять операцию, если существует файл /tmp/nginx->.tar.gz.
Настройка системы
В данном разделе мы рассмотрим процессы, которые больше подходят для категории настройки системы.
1. Добавить задание в cron.
Выполняется с помощью модуля cron:
* в данном примере мы создадим задание для запуска команды /scripts/command.sh каждый день, каждые 6 часов.
2. Добавить публичный ключ хоста в known_hosts.
Делается с помощью known_hosts. Пример из официальной документации:
3. Создание новых SSH-ключей для сервера.
Создание ключей реализуется с помощью модуля openssh_keypair:
* в данном примере мы создадим 4 ключа разных типов: dsa, ecdsa, ed25519, rsa. Так как у каждого из них свои требования к размеру, перечень представлен в виде двумерного массива. Ключи будут созданы в каталоге /etc/ssh/.
4. Создание системной учетной записи.
Для этого есть модуль user. У него много опций, но для создания системной учетной записи нам достаточно:
- name: Create User Consul
user:
name: consul
system: yes
comment: "Consul Agent"* в данном примере будет создана учетная запись consul.
5. Работа с systemd.
Для данной настройки есть одноименный модуль systemd. Рассмотрим варианты его использования.
а) перечитать конфигурацию (необходимо делать каждый раз, когда мы меняем настройки юнита):
- name: systemd reload
systemd:
daemon_reload: yesб) разрешить сервис (автозапуск):
- name: mysql enable
systemd:
name: mysql
enabled: yes* для сервиса mysql.
в) перезапустить сервис:
- name: mysql reload
systemd:
name: mysql
state: restarted* для сервиса mysql.
6. Настройка брандмауэра.
Выполняется разными модулями в зависимости от используемой системы управления netfilter:
Рассмотрим небольшие примеры.
- name: Block specific IP
iptables:
chain: INPUT
source: 8.8.8.8
jump: DROPДобавить 80 порт:
Добавить порты с циклом:
Работа с папками и файлами
Рассмотрим задачи, которые помогут нам создавать, копировать и работать с файлами.
1. Создание каталогов и файлов.
Создание файлов и каталогов выполняется с помощью модуля file.
а) для каталога в качестве state указываем directory:
б) для создания файла указываем убираем опцию state (или даем ей значение file):
- name: Create File
file:
path: "/var/www/site1/index.php"
owner: www-data
group: www-data
mode: 0644* в данном примере мы созданим файл index.php в каталоге /var/www/site1.
2. Копирование файлов из каталога.
Для копирования данных мы используем модуль copy:
- name: Copy Cert File If Different
copy:
src: ">"
dest: /etc/ssl/dmosk
remote_src: no
mode: 0644
owner: root
group: root
with_fileglob:
- files/** в данном примере мы прочитаем все содержимое каталога files на компьютере с ansible, и скопируем его в каталог /etc/ssl/dmosk на целевом компьютере.
3. Используем шаблон.
Копирование из шаблона отличается от копирования из файла тем, что в шаблоне могут использоваться переменные, которые будет заменяться их значениями в момент копирования. Для самого процесса копирования из шаблона используется модуль template:
- name: Create Config for Consul Agent
template:
src: templates/consul/config.json.j2
dest: /etc/consul.d/config.json* в данном примере мы возьмом шаблон templates/consul/config.json.j2 на компьютере ansible и разместим его в по пути /etc/consul.d/config.json на целевом компьютере.
4. Удалить последние 30 файлов.
Задача решается в два этапа:
- ищем содержимое целевого каталога.
- сотритуем список найденных по времени изменения файлов и удаляем все, что идут после определенного числа объектов.
Поиск выполняем с помощью модуля find, удаление — file:
- name: "Get list of backup files"
find:
paths: "/backup"
file_type: file
register: founds* в данном примере мы ищем файлы в каталоге /backup, после чего сортируем найденное и удаляем по списку все файлы, которые идут после 30-го.
Для этого используется модуль uri. Простой пример:
* в данном примере мы скачаем файл с ресурса, где требуется аутентификация по токену, который передается в заголовке. Заголовки мы передаем с помощью параметра headers. Также мы задаем права на загруженный файл и делаем в качестве владельца пользователя и группу dmosk.
Виртуализация VMware
Работа с виртуальными машинами на платформе VMware выполняется с помощью модуля vmware_guest.
Мы рассмотрим несколько примеров.
1. Базовое подключение.
Для выполнения действий над виртуальными машинами мы должны подключиться к хосту VMware. Для этого используем данные строки:
* параметр validate_certs, выставленный в no, позволит избежать ошибки, если у нас на хосте используется самоподписанный сертификат (как правило, так и есть).
2. Переименовать виртуальную машину.
Для выполнения действия нам нужно знать идентификатор виртуальной машины:
* где uuid — идентификатор виртуальной машины; name — новое имя виртуальной машины.
3. Конвертировать виртуальную машину в шаблон.
Для этого нужно просто задать признак is_template:
Разное
В данном разделе будет рассказано о дополнительных опциях, которые позволяют менять поведение выполнения задач, добавляет функциональности или все то, для чего не найдена отдельная подходящая категория.
1. Шифрование строки.
С помощью ansible-vault мы можем шифровать файлы и папки. Это позволит нам хранить секреты не в открытом виде. Данные расшифровываются в момент выполнения задач.
Данной командой мы получаем шифрованную строку:
Система запросит ввести дважды пароль и предложит ввести строку, которую нужно зашифровать. После мы должны нажать 2 раза Ctrl + D — мы получим строку, которая начинается с !Vault и различные символы.
Для того, чтобы в момент выполнения задачи ansible расшифровал данные, при запуске плейбука мы должны указать ключ --ask-vault-pass:
2. Игнорировать ошибки.
Если ansible столкнется с ошибкой при выполнении задачи, работа плейбука будет завершена. Иногда, нужно пропустить ошибку при выполнении определенной задачи, чтобы выполнение было продолжено. Для этого существует опция ignore.
а) чтобы пропустить ошибки выполнения, в настройка задачи используем:
- name: Bad Task
.
ignore_errors: yesб чтобы игнорировать ошибки при подключении к хосту:
- name: Bad Task
.
ignore_unreachable: yes3. Начинать выполнение с определенной задачи.
При выполнении отладки, полезно запустить плейбук, но начать выполнение с определенной задачи. Остальные пропустить.
Это можно сделать с помощью опции --start-at-task:
ansible-playbook . --start-at-task="Start Job"
* в данном примере плейбук начнет выполнять задания с задачи Start Job.
4. Завершить выполнение плейбука после определенной задачи.
С помощью данной конструкции:
5. Зависимые роли.
С помощью файла meta/main.yml в роли мы можем определить пред-роль, от которой зависит выполнение текущей роли. Для этого настраивается опция dependencies:
dependencies:
- role: pred6. Вставка роли и ее задач.
Позволяет в процессе выполнения задачи подключить роль. Делается при помощи include_role:
- name: "Include Other Role"
include_role:
name: other_roleА это пример, как подключить роль и сделать так, чтобы все ее задачи выполнились на определенном хосте:
7. Замены в строке.
Замены выполняются с помощью модуля replace:
* в данном примере мы добавляем комментарий к строке server.address=127.0.0.1.
8. Повторы при выполнении задачи.
Мы можем управлять цикличностью выполнения задач с помощью retries (количиство повторов), delay (задержка в секундах).
Рассмотрим пример повтора выполнения задачи при возникновении ошибки:
- name: Run anything command
command: /foo/bar/cmd
register: result
retries: 3
delay: 60
until: result is not failed* в данном примере мы будем выполнять команду /foo/bar/cmd пока ее выполнение не закончится без ошибок. Количество повторов будет равен 3 с интервалом в 60 секунд.
Читайте также: