Введение

В этом лабораторном занятии (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: Использует модуль Ansible copy, который служит для копирования файлов с управляющего узла (локального хоста) на удаленный хост.
  • 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!