На этом шаге вы научитесь использовать один из наиболее фундаментальных модулей Ansible: ansible.builtin.copy. Этот модуль используется для передачи файлов с вашего управляющего узла (виртуальной машины LabEx) в указанное место на управляемых хостах. В нашем случае управляемым хостом будет сам localhost. Помимо простого копирования, модуль copy позволяет точно контролировать атрибуты файла, такие как владелец, группа и права доступа, что крайне важно для правильной настройки системы.
Сначала настроим среду нашего проекта. Вся наша работа будет проводиться в каталоге ~/project.
-
Перейдите в каталог проекта и создайте подкаталог для наших исходных файлов. Это распространенная практика для поддержания порядка в проекте.
Установите пакет ansible-core.
sudo dnf install -y ansible-core
Затем перейдите в каталог проекта и создайте подкаталог для наших исходных файлов.
cd ~/project
mkdir files
-
Далее создайте простой текстовый файл, который мы будем копировать. Мы используем команду cat с "here document" для создания файла info.txt в каталоге files.
cat << EOF > ~/project/files/info.txt
This file was deployed by Ansible.
It contains important system information.
EOF
-
Теперь создайте файл инвентаря Ansible. Инвентарь сообщает Ansible, какие хосты необходимо управлять. Для этой лабораторной работы мы будем управлять локальной машиной. Создайте файл с именем inventory.ini.
cat << EOF > ~/project/inventory.ini
localhost ansible_connection=local
EOF
В этом инвентаре localhost — это хост, на который мы нацелены. Переменная ansible_connection=local указывает Ansible выполнять задачи непосредственно на управляющем узле, без использования SSH.
-
Создайте свой первый плейбук Ansible. Этот плейбук будет содержать инструкции по копированию файла. Используйте nano или cat для создания файла с именем copy_file.yml.
nano ~/project/copy_file.yml
Добавьте следующее содержимое в файл. Этот плейбук определяет одну задачу: скопировать info.txt в каталог /tmp/ и установить его атрибуты.
---
- name: Deploy a static file to localhost
hosts: localhost
tasks:
- name: Copy info.txt and set attributes
ansible.builtin.copy:
src: files/info.txt
dest: /tmp/info.txt
owner: labex
group: labex
mode: "0640"
Давайте разберем параметры в задаче copy:
src: files/info.txt: Путь к исходному файлу на управляющем узле, относительно расположения плейбука.
dest: /tmp/info.txt: Абсолютный путь, по которому файл будет размещен на управляемом хосте.
owner: labex: Устанавливает владельцем файла пользователя labex.
group: labex: Устанавливает группой файла группу labex.
mode: '0640': Устанавливает права доступа к файлу. 0640 означает, что владелец может читать/писать, группа может читать, а остальные не имеют разрешений.
-
Выполните плейбук с помощью команды ansible-playbook. Флаг -i указывает наш файл инвентаря.
ansible-playbook -i inventory.ini copy_file.yml
Вы должны увидеть вывод, указывающий на успешное выполнение плейбука, примерно следующий:
PLAY [Deploy a static file to localhost] ***************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Copy info.txt and set attributes] ****************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
-
Наконец, проверьте, что файл был скопирован правильно и имеет нужные атрибуты. Используйте команду ls -l для проверки прав доступа, владельца и группы.
ls -l /tmp/info.txt
Вывод должен показать, что labex является владельцем и группой, а права доступа установлены как -rw-r-----.
-rw-r----- 1 labex labex 72 Jul 10 14:30 /tmp/info.txt
Вы также можете просмотреть содержимое файла, чтобы убедиться, что он был скопирован полностью.
cat /tmp/info.txt
This file was deployed by Ansible.
It contains important system information.