Введение
В этом лабораторном занятии (lab) вы познакомитесь с модулем Ansible Copy, который позволяет копировать файлы и директории на удаленные хосты. Модуль Copy предоставляет гибкий и эффективный способ передачи файлов в рамках автоматических задач Ansible.
Копирование файла на удаленный хост
На этом шаге вы скопируете файл с управляющей машины на удаленный хост с использованием модуля Ansible Copy.
Сначала создайте новый файл Ansible playbook с именем /home/labex/project/copy-module-playbook.yaml и откройте его в текстовом редакторе.
Добавьте следующее содержимое в файл playbook:
- hosts: localhost
tasks:
- name: Copy a file to remote host
copy:
src: /home/labex/file.txt
dest: /home/labex/project/file.txt
copy: Использует модуль Ansiblecopy, который служит для копирования файлов с управляющего узла (локального хоста) на удаленный хост.src: Указывает путь к исходному файлу, то есть путь к файлу, который необходимо скопировать на локальном хосте.dest: Указывает путь к целевому файлу, то есть место, куда файл должен быть скопирован на удаленном хосте.
С помощью этой задачи playbook файл /home/labex/file.txt будет скопирован в путь /home/labex/project/file.txt на удаленном хосте. Модуль Ansible copy облегчает процесс эффективного копирования файлов.
Далее создайте файл с именем file.txt в директории /home/labex.
echo "This is the content of the file." > /home/labex/file.txt
Затем запустите playbook с помощью следующей команды:
ansible-playbook copy-module-playbook.yaml
Пример вывода:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Copy a file to remote host] **********************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Наконец, убедитесь, что файл file.txt существует в указанном целевом пути на удаленном хосте.
cat /home/labex/project/file.txt
Пример вывода:
This is the content of the file.
Здесь "This is the content of the file." совпадает с содержимым файла /home/labex/file.txt, что означает, что файл /home/labex/file.txt был успешно скопирован в /home/labex/project/file.txt.
Копирование директории на удаленный хост
На этом шаге вы скопируете директорию с управляющей машины на удаленный хост с использованием модуля Ansible Copy.
Сначала измените существующий файл playbook, удалив все его содержимое и добавив следующее содержимое:
- hosts: localhost
tasks:
- name: Copy a directory to remote host
copy:
src: /home/labex/directory
dest: /home/labex/project/
В данном случае, если параметр src установлен на директорию, эта задача playbook скопирует директорию /home/labex/directory в путь /home/labex/project/ на удаленном хосте.
Далее создайте директорию с именем directory в директории /home/labex и файл с именем file2.txt в директории directory.
mkdir /home/labex/directory
touch /home/labex/directory/file2.txt
Затем запустите playbook с помощью следующей команды:
ansible-playbook copy-module-playbook.yaml
Пример вывода:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Copy a directory to remote host] *****************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Наконец, убедитесь, что директория directory и ее содержимое существуют в указанном целевом пути на удаленном хосте.
tree /home/labex/project
Ожидаемый вывод:
/home/labex/project
├── copy-module-playbook.yaml
├── directory
│ └── file2.txt
└── file.txt
1 directory, 3 files
Вы можете видеть, что директория directory и файл file2.txt были успешно скопированы в директорию /home/labex/project на целевом хосте.
Сохранение атрибутов файла
На этом шаге вы узнаете, как сохранить атрибуты файла, такие как права доступа и метки времени, при использовании модуля Ansible Copy.
Сначала измените существующий файл playbook, удалив все его содержимое и добавив следующее содержимое:
- hosts: localhost
tasks:
- name: Preserve file attributes
copy:
src: /home/labex/file.txt
dest: /tmp/file.txt
mode: preserve
mode: preserve: Этот параметр сохраняет режим (права доступа) исходного файла во время процесса копирования, обеспечивая, чтобы целевой файл имел те же права доступа, что и исходный файл.
С помощью этой задачи playbook файл /home/labex/file.txt будет скопирован в /tmp/file.txt на удаленном хосте с сохранением атрибутов файла, таких как права доступа.
Затем запустите playbook с помощью следующей команды:
ansible-playbook copy-module-playbook.yaml
Пример вывода:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Preserve file attributes] ************************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Наконец, убедитесь, что файл file.txt скопирован в указанный целевой путь на удаленном хосте с сохранением его атрибутов.
Используйте команду ll для просмотра деталей файла /home/labex/file.txt:
ll /home/labex/file.txt
Пример вывода:
-rw-rw-r-- 1 labex labex 33 Mar 9 08:34 /home/labex/file.txt
Используйте команду ll для просмотра деталей файла /tmp/file.txt:
ll /tmp/file.txt
Пример вывода:
-rw-rw-r-- 1 labex labex 33 Mar 9 09:00 /tmp/file.txt
Этот Ansible playbook можно использовать для сохранения шаблонов прав доступа (битов прав доступа) и информации о владельце во время процесса копирования.
Управление правами доступа
На этом шаге вы узнаете, как управлять правами доступа к файлам при использовании модуля Ansible Copy. Вы научитесь устанавливать конкретные права доступа для скопированного файла на удаленном хосте.
Сначала измените существующий файл playbook, удалив все его содержимое и добавив следующее содержимое:
- hosts: localhost
tasks:
- name: Handle permissions
copy:
src: /home/labex/file.txt
dest: /tmp/file1.txt
mode: "0644"
mode: Замените"0644"на желаемый режим прав доступа для файла. Для получения более подробной информации о режимах прав доступа обратитесь к документации по chmod.
С помощью этой задачи playbook файл /home/labex/file.txt будет скопирован в /tmp/file1.txt на удаленном хосте с указанными правами доступа 0644.
Затем запустите playbook с помощью следующей команды:
ansible-playbook copy-module-playbook.yaml
Пример вывода:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Handle permissions] ******************************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Наконец, убедитесь, что файл file1.txt скопирован в указанный целевой путь на удаленном хосте с установленными правами доступа.
Используйте команду ll для просмотра деталей файла /home/labex/file.txt:
ll /home/labex/file.txt
Пример вывода:
-rw-rw-r-- 1 labex labex 33 Mar 9 08:34 /home/labex/file.txt
Используйте команду ll для просмотра деталей файла /tmp/file1.txt:
ll /tmp/file1.txt
Пример вывода:
-rw-r--r-- 1 labex labex 33 Mar 9 09:11 /tmp/file1.txt
Этот Ansible playbook можно использовать для установки конкретных прав доступа, таких как чтение, запись и выполнение, для файла на удаленном хосте.
Идемпотентное копирование
На этом шаге вы сделаете операцию копирования идемпотентной с использованием модуля Ansible Copy. Вы будете обеспечивать, чтобы файл копировался только в том случае, если он отсутствует на удаленном хосте или если исходный файл был изменен.
Сначала измените существующий файл playbook, удалив все его содержимое и добавив следующее содержимое:
- hosts: localhost
tasks:
- name: Idempotent copy
copy:
src: /home/labex/file.txt
dest: /tmp/file2.txt
remote_src: yes
remote_src: yes: Этот параметр указывает, что путьsrcнаходится на удаленном хосте, позволяя Ansible переносить файлы с удаленного хоста в другое место.
С помощью этой задачи playbook файл /home/labex/file.txt, расположенный на удаленном хосте, будет скопирован в /tmp/file2.txt на удаленном хосте только в том случае, если он отсутствует или если исходный файл был изменен.
Далее проверьте, существует ли файл /tmp/file2.txt.
ll /tmp/file2.txt
Пример вывода:
ls: cannot access '/tmp/file2.txt': No such file or directory
Затем запустите playbook с помощью следующей команды:
ansible-playbook copy-module-playbook.yaml
Пример вывода:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Idempotent copy] *********************************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Наконец, убедитесь, что файл file2.txt скопирован в указанный целевой путь на удаленном хосте только в том случае, если он отсутствует или если исходный файл был изменен.
ll /tmp/file2.txt
Пример вывода:
-rw-rw-r-- 1 labex labex 33 Mar 9 08:34 /tmp/file2.txt
В этот момент запустите playbook еще раз.
ansible-playbook copy-module-playbook.yaml
Пример вывода:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Idempotent copy] *********************************************************
ok: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Обратите внимание, что changed=1 стало changed=0, что доказывает, что этот Ansible playbook может обеспечить, чтобы файл копировался только в том случае, если он отсутствует на удаленном хосте или если исходный файл был изменен.
Резюме
Поздравляем! Вы успешно завершили лабораторную работу по модулю Ansible Copy. Вы научились использовать модуль Copy для копирования файлов и директорий на удаленные хосты, сохранения атрибутов файлов, управления правами доступа и обеспечения идемпотентности.
Модуль Copy - это мощный инструмент для передачи файлов в задачах автоматизации Ansible. Он предоставляет различные параметры для настройки операции копирования в соответствии с вашими требованиями.
Теперь, когда вы хорошо понимаете модуль Copy, вы можете использовать его возможности в своих Ansible playbook для эффективного управления передачей и синхронизацией файлов в своей инфраструктуре. Удачного копирования с использованием Ansible!


