Ansible копирование файлов на удаленный сервер
Это руководство по стилю шпаргалки содержит краткую справку о командах и методах, обычно используемых при работе с 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:
Что-то не смог понять из примеров в документации - как же скопировать файл с удалённого сервера на локальный и наоборот? Вот есть модули copy и fetch, например. Вот я пишу в плейбуке:
Как указать ansible, с какого хоста я хочу скопировать файл? Ну и соответственно, при копировании на удалённый хост, где указывать этот удалённый хост?
P.S. Немного разобрался: Чтобы скопировать файл с удалённого хоста на локальный:
Файл test.txt будет лежать в каталоге ./backup/localhost/>
Скопировать с локального на удалённый:
Подозреваю, что, если указать в начале - hosts: > вместо localhost, то delegate_to использовать не нужно.
Ну зачем же так сложно? ))
Все эти задачи решаются и без мороки с Delegation и Local Actions, вам же самим потом сложнее будет разбираться в собственных плейбуках или читать чужие, написанные по-простому.
В каждом плейбуке вы указываете на каких хостах запускать задачи - пишете hosts: '>' (если хотите из командной строки управлять списком через --extra-vars "target=10.0.100.123") или hosts: dbservers (если фиксировать плейбук на группу хостов):
Эти хосты - "удалённый" сервер, ну а "локальный" - это само собой хост, на котором находится ваш плейбук.
- Для копирования файла с локального сервера на удалённый -- используете модуль copy
- Для копирования файла с удалённого сервера на локальный -- используете модуль fetch
И в copy и в fetch src - это откуда брать файл, а dest - это куда положить файл. Для copy src=local а dest=remote, для fetch -- наоборот src=remote, а dest=local.
Вот и всё. Вам кстати именно об этом говорили в комментарии к вашему последнему вопросу: "В целом Ansible подразумевает то, что ты уже на удаленном хосте", не надо нарезать лишние петли вокруг локалхоста.
PS Если нужно копировать с произвольного хоста на произвольный хост - то смотрите в сторону модуля syncronyze на основе rsync. Но вообще в 90% случаев вам понадобится копирование с локального хоста на удалённый и будете использовать copy или template.
Для копирования удаленных файлов на удаленные вы можете использовать модуль синхронизации с delegate_to: source-server ключевым словом ' ':
Этот сценарий может запускаться с вашего компьютера C.
хороший ответ! К сожалению, мне не удалось заставить его работать в среде Vagrant с несколькими виртуальными машинами. Похоже, Бродяга там делает что-то особенное. Он использует rsync, он у вас установлен на виртуальной машине? Это фактически копирует файлы с serverB на serverA. Если вы хотите скопировать их с serverA на serverB, используйте mode=push (или delegate_to: serverB , но не оба). @MariusGedminas, вы правы, mode=push следует использовать, но в этой ситуации delegate_to: serverB нельзя использовать, потому что это сделает serverB источник и место назначения.Как уже указывал ant31, вы можете использовать synchronize для этого модуль. По умолчанию модуль передает файлы между управляющей машиной и текущим удаленным хостом ( inventory_host ), однако это можно изменить с помощью параметра задачи delegate_to (важно отметить, что это параметр задачи , а не модуля).
Вы можете разместить задачу на любом ServerA или ServerB , но вы должны соответствующим образом скорректировать направление передачи (с помощью mode параметра synchronize ).
Ставим задачу на ServerB
При этом используется значение по умолчанию mode: push , поэтому файл передается от delegate ( ServerA ) к текущему удаленному ( ServerB ).
Это может показаться странным, поскольку задача помещена в ServerB (через hosts: ServerB ). Однако следует иметь в виду, что задача на самом деле выполняется на делегированном хосте , которым в данном случае и является ServerA . Так что толкание (от ServerA к ServerB ) - действительно правильное направление. Также помните, что мы не можем просто отказаться от делегирования вообще, поскольку это будет означать, что передача происходит между управляющей машиной и ServerB .
Ставим задачу на ServerA
Используется mode: pull для изменения направления передачи. Опять же, имейте в виду, что задача фактически выполняется на ServerB , поэтому вытягивание - правильный выбор.
Ansible – это современный инструмент управления конфигурацией, который упрощает настройку и обслуживание удаленных серверов. Минималистичный дизайн позволяет быстро включиться в работу, с его помощью можно централизованно управлять сотнями систем – это делается через плейбуки или через специальные команды.
Плейбуки – это файлы, состоящие из наборов задач, которые можно использовать повторно. А специальные команды – это задачи, которые выполняются не так часто (это, например, перезапуск сервиса или извлечение информации об удаленных системах, которыми управляет Ansible).
В этом мануале вы узнаете, как использовать специальные команды Ansible для выполнения типичных задач, таких как установка пакетов, копирование файлов и перезапуск сервисов на одном или нескольких удаленных серверах с управляющей ноды Ansible.
Требования
- Главная (управляющая) нода Ansible. В этом мануале предполагается, что в этом качестве вы используете компьютер Ubuntu 20.04 с установкой Ansible, который подключается к хостам Ansible с помощью ключей SSH. Также на главной ноде нужен обычный пользователь sudo и включенный брандмауэр, как описано в этом мануале. Чтобы установить Ansible, следуйте этому руководству.
- Два хоста Ansible (можно больше). Хост Ansible – это любой компьютер, настройками которого может управлять главная нода Ansible. В этом мануале предполагается, что в качестве хостов Ansible вы используете удаленные серверы Ubuntu 20.04. Убедитесь, что на каждом хосте Ansible есть открытый SSH ключ главной ноды Ansible (его нужно добавить в authorized_keys системного пользователя). Для этого можно использовать либо аккаунт root, либо обычного пользователя sudo. За инструкциями обратитесь к разделу 2 этого мануала.
- Файл инвентаря на главной ноде Ansible, содержащий все хосты Ansible. Чтобы настроить такой файл, обратитесь к мануалу Создание файла инвентаря Ansible. Предварительно протестируйте подключение между главной нодой и хостами
Тестирование подключения хостов Ansible
Следующая команда проверит соединение между главной нодой и всеми хостами Ansible. Эта команда использует текущего системного пользователя и соответствующий ему SSH-ключ в для удаленного входа в систему и включает параметр -m, который сообщает Ansible о необходимости запустить модуль ping. Она также содержит флаг -i, с помощью которого Ansible будет пинговать хосты, перечисленные в указанном файле инвентаря.
Если вы впервые подключаетесь к этим серверам через SSH, вам будет предложено подтвердить подлинность хостов. При появлении запроса введите yes и нажмите Enter.
Вы должны получить примерно такой результат:
server1 | SUCCESS => "changed": false,
"ping": "pong"
>
server2 | SUCCESS => "changed": false,
"ping": "pong"
>Если вы получили от хоста ответ «pong», это означает, что соединение установлено, и вы можете выполнять команды Ansible на этом сервере.
Настройка параметров подключения
По умолчанию Ansible пытается подключиться к хостам через удаленного пользователя с тем же именем, что и у вашего текущего системного пользователя, используя соответствующую ему пару ключей SSH.
Чтобы подключиться как другой удаленный пользователь, добавьте команду с флагом –u, после которого укажите имя нужного пользователя:
ansible all -i inventory -m ping -u 8host
ansible all -i inventory -m ping --private-key=
После того как вы подключитесь, используя соответствующие параметры, вы сможете настроить файл инвентаря. В нем можно установить другого удаленного пользователя и закрытый ключ, если они не соответствуют значениям Ansible по умолчанию. Тогда вам не нужно будет указывать эти параметры в командной строке.
В следующем примере файла инвентаря переменная ansible_user настроена только для сервера server1:
server1 ansible_host=203.0.113.111 ansible_user=8host
server2 ansible_host=203.0.113.112Теперь Ansible будет использовать аккаунт 8host в качестве удаленного пользователя по умолчанию при подключении к серверу server1.
Чтобы настроить пользовательский ключ SSH, включите переменную ansible_ssh_private_key_file:
server1 ansible_host=203.0.113.111 ansible_ssh_private_key_file=/home/8host/.ssh/custom_id
server2 ansible_host=203.0.113.112В обоих случаях мы установили собственные значения только для server1. Если вы хотите использовать одни и те же настройки для нескольких серверов сразу, используйте для этого дочернюю группу:
[group_a] 203.0.113.111
203.0.113.112
[group_b] 203.0.113.113
[group_a:vars] ansible_user=8host
ansible_ssh_private_key_file=/home/8host/.ssh/custom_idВ этом примере пользовательские конфигурации (другой аккаунт и ключ SSH) будут применяться только для подключения к серверам группы group_a.
Определение целей для выполнения команд
При выполнении специальных команд Ansible вы можете настроить целевые хосты, а также любую комбинацию групп, хостов и подгрупп. Например, вот как можно проверить подключение каждого хоста в группе servers:
ansible servers -i inventory -m ping
Вы также можете указать несколько хостов и групп, разделив их двоеточиями:
ansible server1:server2:dbservers -i inventory -m ping
Чтобы добавить в шаблон исключение, используйте восклицательный знак, поставив перед ним escape-символ \, как показано ниже. Эта команда будет запущена на всех серверах из группы group1, кроме server2:
ansible group1:\!server2 -i inventory -m ping
Если вам нужно запустить команду только на серверах, которые входят и в group1, и group2, вам следует использовать символ &. Не забудьте поставить перед ним обратный слеш:
ansible group1:\&group2 -i inventory -m ping
За дополнительной информацией о том, как использовать шаблоны при определении целей для команд, обратитесь к разделу 5 мануала Создание файла инвентаря Ansible.
Запуск модулей Ansible
Ansible предоставляет широкий выбор встроенных модулей, некоторые из которых требуют установки дополнительного программного обеспечения для полноценной работы. Вы также можете создавать свои собственные пользовательские модули.
Чтобы выполнить модуль с аргументами, добавьте в команду флаг -a, а затем соответствующие параметры в двойных кавычках:
ansible target -i inventory -m module -a "module options"
В качестве примера мы используем модуль apt для установки пакета tree на server1:
ansible server1 -i inventory -m apt -a "name=tree"
Запуск команд Bash
Если модуль не указан с помощью опции -m, для выполнения указанной команды на удаленном сервере по умолчанию используется модуль command.
Это позволяет выполнить практически любую команду, которую обычно можно запустить через терминал SSH (при условии, что подключающийся пользователь имеет достаточные права, а команда не использует интерактивные запросы).
В этом примере команда uptime выполняется на всех серверах из указанного инвентаря:
ansible all -i inventory -a "uptime"
server1 | CHANGED | rc=0 >>
14:12:18 up 55 days, 2:15, 1 user, load average: 0.03, 0.01, 0.00
server2 | CHANGED | rc=0 >>
14:12:19 up 10 days, 6:38, 1 user, load average: 0.01, 0.02, 0.00Повышение привилегий для выполнения команд с помощью sudo
ansible server1 -i inventory -a "tail /var/log/nginx/error.log" --become
Это эквивалентно запуску команды sudo tail /var/log/nginx/error.log на удаленном хосте с помощью текущего пользователя локальной системы или удаленного пользователя, указанного в инвентаре.
ansible server1 -i inventory -a "tail /var/log/nginx/error.log" --become -K
Установка и удаление пакетов
В следующем примере модуль apt используется для установки пакета nginx на все хосты из текущего инвентаря:
ansible all -i inventory -m apt -a "name=nginx" --become -K
Чтобы удалить пакет, включите в команду аргумент state и присвойте ему значение absent.
ansible all -i inventory -m apt -a "name=nginx state=absent" --become -K
Копирование файлов
С помощью модуля file вы можете копировать файлы между главной нодой и управляемыми хостами в любом направлении. Следующая команда копирует локальный текстовый файл на все удаленные хосты:
ansible all -i inventory -m copy -a "src=./file.txt dest=
Чтобы скопировать файл с удаленного сервера на главную ноду, включите опцию remote_src:
ansible all -i inventory -m copy -a "src=
/myfile.txt remote_src=yes dest=./file.txt"
Изменение прав доступа к файлу
Чтобы изменить права доступа к файлам и каталогам на удаленных нодах, вы можете использовать модуль file.
Следующая команда настроит права для файла file.txt, расположенного в /var/www на удаленном хосте. Она установит umask файла на 600, вследствие чего чтение и запись будут доступны только текущему владельцу файла. Кроме того, команда установит право собственности на этот файл для пользователя и группы по имени 8host:
ansible all -i inventory -m file -a "dest=/var/www/file.txt mode=600 owner=8host group=8host" --become -K
Перезапуск сервисов
Чтобы перезапустить сервис nginx на всех хостах в группе webservers, запустите такую команду:
ansible webservers -i inventory -m service -a "name=nginx state=restarted" --become -K
Перезагрузка серверов
В Ansible нет специального модуля для перезагрузки серверов, но вы можете выполнить команду bash, которая вызывает команду /sbin/reboot на удаленном хосте.
Важно! Следующая команда полностью перезапустит сервер или серверы, которыми управляет Ansible. Это может вызвать временный сбой в работе всех приложений, использующих эти серверы.
Например, чтобы перезапустить все серверы в группе webservers, запустите такую команду:
ansible webservers -i inventory -a "/sbin/reboot" --become -K
Сбор информации об удаленных нодах
Модуль setup возвращает подробную информацию (системные данные) об удаленных системах под управлением Ansible.
Чтобы получить системные данные server1, введите:
ansible server1 -i inventory -m setup
ansible server1 -i inventory -m setup -a "gather_subset=min"
Чтобы вывести только определенные элементы JSON, вы можете использовать аргумент filter. Он принимает подстановочный шаблон для сравнения строк и поиска совпадений, аналогично fnmatch. Например, чтобы получить информацию о сетевых интерфейсах ipv4 и ipv6, вы можете использовать *ipv* в качестве фильтра:
ansible server1 -i inventory -m setup -a "filter=*ipv*"
server1 | SUCCESS => "ansible_facts": "ansible_all_ipv4_addresses": [
"203.0.113.111",
"10.0.0.1"
],
"ansible_all_ipv6_addresses": [
"fe80::a4f5:16ff:fe75:e758"
],
"ansible_default_ipv4": "address": "203.0.113.111",
"alias": "eth0",
"broadcast": "203.0.113.111",
"gateway": "203.0.113.1",
"interface": "eth0",
"macaddress": "a6:f5:16:75:e7:58",
"mtu": 1500,
"netmask": "255.255.240.0",
"network": "203.0.113.0",
"type": "ether"
>,
"ansible_default_ipv6": <>
>,
"changed": false
>Если вы хотите проверить использование диска, вы можете запустить команду Bash, вызывающую утилиту df:
ansible all -i inventory -a "df -h"
server1 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 798M 624K 798M 1% /run
/dev/vda1 155G 2.3G 153G 2% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/vda15 105M 3.6M 101M 4% /boot/efi
tmpfs 798M 0 798M 0% /run/user/0
server2 | CHANGED | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
udev 2.0G 0 2.0G 0% /dev
tmpfs 395M 608K 394M 1% /run
/dev/vda1 78G 2.2G 76G 3% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/vda15 105M 3.6M 101M 4% /boot/efi
tmpfs 395M 0 395M 0% /run/user/0Заключение
В этом мануале вы узнали, как использовать специальные команды Ansible для управления удаленными серверами: как выполнять общие задачи, перезапускать сервисы, копировать файлы с главной ноды на удаленные хосты Ansible, собирать информацию с удаленных хостов, использовать разные параметры и фильтры.
За дополнительной информацией обращайтесь к официальной документации Ansible по специальным командам.
Я пытаюсь скопировать содержимое каталога dist в каталог nginx.
но когда я выполняю playbook, он выдает ошибку:
у него есть ошибка копирования каталога? Как скопировать содержимое каталога, которое находится внутри другого каталога и файла?
можно использовать синхронизация модуль. Пример из документации:
Это имеет дополнительное преимущество, что он будет более эффективен для больших/много файлов.
решен ответить: Чтобы скопировать содержимое каталога в другой каталог я использую следующий:
он копирует в другой каталог. В частности, одним из элементов является каталогом, а другой-нет. Он отлично работает.
Ansible Copy модуль по умолчанию копирует файлы/директории с управлением машины на удаленную машину. Если вы хотите скопировать файлы/директории на удаленной машине и если у вас есть Ansible 2.0, set remote_src to yes
самое простое решение, которое я нашел, чтобы скопировать содержание папки без копирования самой папки использовать следующее:
карта @surfer190последующий вопрос:
Хммм, что если вы хотите скопировать все содержимое? Я заметил, что * не работает-surfer190 Jul 23 ' 16 в 7: 29
Ansible remote_src не поддерживает рекурсивное копирование.См.описание remote_src в Ansible copy docs
чтобы рекурсивно скопировать содержимое папки и убедиться, что задача остается идемпотентной, я обычно делаю это так:
недостатком является то, что команда find по-прежнему отображается как "изменено"
Я нашел обходной путь для рекурсивного копирования с удаленного на удаленный:
Я тоже был вовлечен целый день! и, наконец, нашел решение в вместо копия: или : как показано ниже:
строго уведомление: 1. src_path и des_path конец / символ 2. в командной оболочке src_path заканчивается . которая показывает все содержимое каталога 3. Я использовал мой имя удаленного сервера оба в hosts: и выполнить оболочку раздел Дженкинса, вместо remote_src: описатель в план.
Я думаю, что это хороший совет, чтобы запустить ниже команду в разделе Execute Shell в Дженкинсе:
ниже работал для меня,
Это я нашел идеальное решение для копирования файла с сервера Ansible на удаленный.
Читайте также: