Ansible копирование файлов на windows

Обновлено: 08.07.2024

Nov 9, 2015 20:35 · 1027 words · 5 minute read ansible

Мы уже справились установкой системы управления конфигурациями Ansible , написали первый набор инструкций (playbook) и разобрали результат его выполнения, а также ознакомились с использованием переменных в Ansible .

В этой части давайте разберемся с модулями в Ansible .

Система управления конфигурациями Ansible позволяет использовать более двух сотен модулей (полный список модулей и их параметры) для настройки IT-инфраструктуры.

Рассмотрим наиболее часто используемые модули и их параметры.

Модуль command принимает команду и аргументы, разделенные пробелом. Аргументами могут быть:

  • chdir — переход в каталог для выполнения команды;
  • creates — создание файла по указанному пути;
  • removes — удаление файла по указанному пути.

Для проверки работы модуля command напишем набор инструкций /etc/ansible/playbooks/install_ntpdate.yml такого вида:

Результат выполнения данного playbook будет таким:

Модуль shell — это аналог модуля command с важным отличием: для выполнения команд используется оболочка /bin/sh . Параметры такие же, как и у модуля command — chdir , creates и removes .

Модуль script используют при необходимости копирования скрипта на удаленный хост с последующим выполнением. Поддерживаются параметры creates и removes . Для проверки работы данного модуля напишем простейший скрипт /etc/ansible/playbooks/scripts/count_dir.sh со следующим содержимым:

Примечание. Скрипт посчитает количество директорий в /var/log .

Playbook в этом случае будет выглядеть так:

Результат выполнения данного набора инструкций (с выводом отладочной информации) следующий:

Модуль raw предусмотрен для использования в случаях, когда другие командные модули ( command , shell и script ) использовать невозможно. Этот модуль можно использовать на удаленных хостах даже без установленного Python. Пример playbook:

и результат его выполнения:

Модуль file предназначен для создания/удаления каталогов, символических ссылок и файлов, а также для работы с атрибутами файлов. Параметры:

  • group — имя группы-владельца файла/каталога;
  • owner — имя пользователя-владельца файла/каталога;
  • mode — права доступа к файлу/каталогу;
  • path — путь к файлу/каталогу (можно использовать алиасы dest или name);
  • src — путь к файлу, для создания симлинка (используется при state=link );
  • recurse — рекурсивно установить атрибуты файла/каталога (используется при state=directory );
  • state — определяет типы файлов, над которым проводятся операции ( file , link , directory , hard , touch и absent ).

Пример использования модуля в наборе инструкций:

Результат выполнения playbook:

Модуль copy используется для копирования файлов на удаленный хост. Кроме уже описанных выше параметров group , owner , mode может принимать следующие:

  • backup — создает резервную копию файла (в имени файла будет дописан timestamp );
  • dest — куда будет скопирован файл (абсолютный путь на удаленном хосте);
  • directory_mode — используется для рекурсивного копирования каталогов;
  • force — копировать файл на удаленный хост, если содержимое файла было изменено;
  • src — откуда копировать файл — локальный путь (абсолютный или относительный).

Пример использования в наборе инструкций:

и результат выполения playbook:

Для управления планировщиком задач используется модуль cron . Может принимать следующие параметры:

  • backup — создает резервную перед изменением;
  • cron_file — использует указанный файл из каталога cron.d вместо пользовательского crontab ;
  • day — день запуска задачи (1-31, *, */2);
  • hour — час запуска задачи (0-23, *, */2);
  • minute — минута запуска задачи (0-59, *, */2);
  • month — месяц запуска задачи (1-12, *, */2);
  • weekday — неделя запуска задачи (0-6 for Sunday-Saturday, *);
  • disabled — закомментировать ранее добавленную задачу;
  • job — задача;
  • name — описание задачи в crontab (комментарий);
  • state — существует ли такая задача(принимает значения present и absent);
  • user — пользователь, в чей crontab следует добавить задачу;
  • special_time — специальное время запуска задачи (reboot, yearly, annually, monthly, weekly, daily и hourly).

Пример playbook с использованием модуля cron :

результатом выполнения задачи будет:

Модуль template используется в Ansible для создания файлов по определенным шаблонам (например, конфигов) на удаленных хостах. Чтобы проверить работу данного модуля, создадим простенький шаблон /etc/ansible/playbooks/templates/hostname/ с таким содержимым:

Playbook с использованием модуля template получится такой:

Результатом выполнения этого набора инструкций будет:

На удаленном хосте по указанному нами пути появился файл со следующим содержимым:

Примечание. Данный модуль также позволяет использовать функцию validate , которая проверяет файл перед его копированием на удаленный сервер.

На этом с модулями в 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 на удаленный.

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 по специальным командам.

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

Рассмотрим структуру и правила написания таких сценариев более подробно.

По данной ссылке я создам небольшую подборку самых интересных и типовых плейбуков, которые могут пригодиться вам в повседневной работе.

Как настраивать защищенные плейбуки описано в этом разделе.

2. Примеры.

Для того, чтобы понять как работают простые команды Ansible, приведу несколько простых примеров. По аналоги вы всегда сможете придумать свои команды под ваши конкретные ситуации.

2.1. Проверка связи.

С помощью Ansible можно одновременно выполнить одну задачу на целой группе серверов.

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

2.1.1. Со всеми нодами.

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

Ответ pong означает, что Ansible готов запускать команды и плейбуки на этой ноде.

Ответ:


2.1.2. С целевыми хостами.

Проверять с целевыми хостами можно и поштучно через их алиасы:

Ответ:


2.1.3. С целевой группой.

Ответ:


2.2. Сбор информации о хостах.

Следующий пример соберёт информацию о хостах и выведёт её на консоль в формате JSON.

Так как список будет безумно длинный, то закажу информацию по одному целевому серверу по его алиасу server1 :

Ответ:


Далее будет длинный-длинный список с перечислением параметров хоста или хостов.

2.3. Создать логический том.

А вот так можно создать логический том или, в зависимости от текущего состояния, изменить его размер с именем examplevolume в группе examplegroup :

Ответ:

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

По умолчанию Ansible пытается подключиться к нодам в качестве текущего пользователя системы через соответствующую пару ключей SSH.

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

То же самое относится и к ansible-playbook:

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

2.5. Настройка пользовательского ключа SSH.

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

Ответ:


Эта опция также работает для ansible-playbook:

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

2.6. Настойка парольной аутентификации.

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

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

Ответ:


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

2.7. Использование пароля sudo.

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

Опция позволит вам ввести пароль sudo удаленного пользователя:

Ответ:


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

2.8. Запуск специальных команд.

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

Например, следующая команда выполнит uname -a на всех нодах в вашем инвентаре:

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

Ответ:


Или удалит vim на какой-то конкретной:

Ответ:


Также с помощью опции -m можно запускать модули Ansible.

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

Это можно сделать, включив параметр --check :

Ответ:


Следующая команда установит пакет Midnight Commander на server1 из вашего инвентаря:


Ответ:


2.10. Расход памяти по хостам.

Иногда требуется узнать расход памяти по хостам:

Ответ:


2.11. Модуль copy.

Модуль copy позволяет копировать файл из управляющей машины Ansible Server на удаленный узел server2 .

Представим, что нам нужно скопировать наш /tmp/from/file1.test в каталог /tmp/to/ узла server2 .

Чтобы создать файл с именем file1.test размером 1 ГБ , вы должны выполнить последовательность действий.

Создадим каталог, из которого будем копировать целевой файл:

Сгенерируем в этот каталог целевой файл:

Ответ:


Создадим на удаленном узле server2 каталог, в который мы будем копировать целевой файл:

Ответ:


Совершим копирование с Ansible Server на удаленный узел server2 :

Читайте также: