Как загружать файлы с определенного URL с помощью модуля Ansible get_url

AnsibleAnsibleBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Ansible – это мощный инструмент автоматизации с открытым исходным кодом, который упрощает управление ИТ-инфраструктурой. В этом руководстве мы рассмотрим модуль Ansible get_url, позволяющий загружать файлы с определенного URL-адреса. Этот модуль необходим для задач автоматизации, таких как установка программного обеспечения, управление конфигурацией и развертывание контента.

В этом руководстве вы узнаете, как настроить Ansible, использовать модуль get_url с базовыми и расширенными параметрами, а также реализуете практические примеры для автоматизации загрузки файлов. К концу этого руководства у вас будет четкое понимание того, как использовать этот модуль для оптимизации процессов управления файлами.

Установка и настройка Ansible

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

Установка Ansible

Начнем с установки Ansible в среде LabEx:

sudo apt update
sudo apt install -y ansible

После выполнения этих команд убедитесь, что Ansible установлен правильно, проверив его версию:

ansible --version

Вы должны увидеть вывод, аналогичный этому, показывающий версию Ansible и детали конфигурации:

ansible [core 2.12.x]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.10.x (default, ...) [GCC 11.x]

Создание рабочего каталога

Далее давайте создадим выделенный каталог для нашего проекта Ansible:

mkdir -p ~/project/ansible-get-url
cd ~/project/ansible-get-url

Настройка простого инвентаря

Ansible должен знать, какими хостами управлять. Для этого руководства мы создадим простой файл инвентаря, который нацелен на локальную машину:

echo "localhost ansible_connection=local" > inventory.ini

Этот файл инвентаря указывает, что мы хотим запустить Ansible против localhost, используя локальное соединение.

Создание файла конфигурации Ansible

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

cat > ansible.cfg << EOF
[defaults]
inventory = inventory.ini
host_key_checking = False
EOF

Этот файл конфигурации сообщает Ansible использовать наш файл инвентаря и отключает проверку ключей хоста, что упрощает соединения в тестовой среде.

Тестирование настройки Ansible

Давайте проверим, что наша конфигурация Ansible работает правильно, выполнив простую команду ping:

ansible localhost -m ping

Вы должны увидеть успешный ответ, например:

localhost | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

Этот вывод подтверждает, что Ansible правильно установлен и может взаимодействовать с localhost. Теперь мы готовы использовать модуль get_url на следующем шаге.

Создание базового плейбука с модулем get_url

Теперь, когда мы настроили Ansible, давайте создадим простой плейбук, который использует модуль get_url для загрузки файла с URL-адреса.

Понимание плейбуков Ansible

Плейбук Ansible – это YAML-файл, который определяет набор задач для выполнения на управляемых хостах. Плейбуки организованы как серия проигрышей (plays), где каждый проигрыш состоит из:

  • Набора хостов для таргетинга
  • Набора задач для выполнения

Создание нашего первого плейбука

Давайте создадим базовый плейбук, который использует модуль get_url. Создайте файл с именем download-file.yml в вашем каталоге проекта:

cd ~/project/ansible-get-url

Откройте редактор файлов и создайте файл со следующим содержимым:

---
- name: Download a file from URL
  hosts: localhost
  become: no
  tasks:
    - name: Create downloads directory
      file:
        path: ~/project/ansible-get-url/downloads
        state: directory
        mode: "0755"

    - name: Download a sample text file
      get_url:
        url: https://raw.githubusercontent.com/ansible/ansible/devel/README.md
        dest: ~/project/ansible-get-url/downloads/ansible-readme.md
        mode: "0644"

Этот плейбук выполняет следующее:

  1. Создает каталог downloads для хранения загруженных файлов
  2. Использует модуль get_url для загрузки файла Ansible README.md с GitHub

Понимание параметров модуля get_url

Давайте разберем ключевые параметры в задаче get_url:

  • url: Указывает URL-адрес, с которого будет загружен файл
  • dest: Определяет путь назначения, где будет сохранен файл
  • mode: Устанавливает разрешения для файла (0644 означает чтение и запись для владельца, чтение для группы и остальных)

Запуск плейбука

Теперь, когда мы создали наш плейбук, давайте запустим его с помощью команды ansible-playbook:

ansible-playbook download-file.yml

Вы должны увидеть вывод, аналогичный этому:

PLAY [Download a file from URL] ***********************************************

TASK [Gathering Facts] ********************************************************
ok: [localhost]

TASK [Create downloads directory] *********************************************
changed: [localhost]

TASK [Download a sample text file] ********************************************
changed: [localhost]

PLAY RECAP ********************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Проверка загруженного файла

Давайте проверим, что файл был загружен правильно:

ls -l ~/project/ansible-get-url/downloads/

Вы должны увидеть загруженный файл:

-rw-r--r-- 1 labex labex 3154 Mar 15 12:34 ansible-readme.md

Вы также можете просмотреть содержимое загруженного файла:

head -n 10 ~/project/ansible-get-url/downloads/ansible-readme.md

Это отобразит первые 10 строк файла Ansible README.md, подтверждая, что он был успешно загружен.

Поздравляем! Вы успешно создали и выполнили свой первый плейбук Ansible, используя модуль get_url для загрузки файла с URL-адреса.

Работа с расширенными опциями get_url

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

Создание расширенного плейбука

Давайте создадим новый плейбук с именем advanced-download.yml, который демонстрирует различные расширенные опции:

cd ~/project/ansible-get-url

Откройте редактор файлов и создайте файл со следующим содержимым:

---
- name: Advanced get_url Module Options
  hosts: localhost
  become: no
  tasks:
    - name: Create advanced downloads directory
      file:
        path: ~/project/ansible-get-url/advanced-downloads
        state: directory
        mode: "0755"

    - name: Download with checksum validation
      get_url:
        url: https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
        dest: ~/project/ansible-get-url/advanced-downloads/jq
        mode: "0755"
        checksum: sha256:af986793a515d500ab2d35f8d2aecd656e764504b789b66d7e1a0b727a124c44

    - name: Download with timeout and retries
      get_url:
        url: https://raw.githubusercontent.com/ansible/ansible-examples/master/README.md
        dest: ~/project/ansible-get-url/advanced-downloads/examples-readme.md
        timeout: 30
        retries: 3
        delay: 5
        force: yes

    - name: Download only if file doesn't exist
      get_url:
        url: https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg
        dest: ~/project/ansible-get-url/advanced-downloads/ansible-example.cfg
        force: no

Понимание расширенных параметров

Давайте рассмотрим расширенные параметры, используемые в этом плейбуке:

  1. Проверка контрольной суммы (Checksum Validation):

    • checksum: Указывает ожидаемую контрольную сумму (checksum) загруженного файла (формат: алгоритм:контрольная сумма)
    • Это обеспечивает целостность загруженного файла и предотвращает загрузку, если файл уже существует с правильной контрольной суммой
  2. Тайм-аут и повторные попытки (Timeout and Retries):

    • timeout: Максимальное время в секундах для завершения HTTP-запроса
    • retries: Количество попыток повторной загрузки в случае сбоя
    • delay: Задержка между повторными попытками в секундах
    • force: Загружать ли файл, даже если он уже существует
  3. Условная загрузка (Conditional Download):

    • force: no: Файл будет загружен только в том случае, если его нет в месте назначения

Запуск расширенного плейбука

Давайте выполним наш расширенный плейбук:

ansible-playbook advanced-download.yml

Вы должны увидеть вывод, аналогичный этому:

PLAY [Advanced get_url Module Options] ****************************************

TASK [Gathering Facts] ********************************************************
ok: [localhost]

TASK [Create advanced downloads directory] ************************************
changed: [localhost]

TASK [Download with checksum validation] **************************************
changed: [localhost]

TASK [Download with timeout and retries] **************************************
changed: [localhost]

TASK [Download only if file doesn't exist] ************************************
changed: [localhost]

PLAY RECAP ********************************************************************
localhost                  : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Проверка расширенных загрузок

Давайте проверим файлы, которые мы загрузили с расширенными опциями:

ls -l ~/project/ansible-get-url/advanced-downloads/

Вы должны увидеть все загруженные файлы:

-rwxr-xr-x 1 labex labex 3773448 Mar 15 12:45 jq
-rw-r--r-- 1 labex labex     426 Mar 15 12:45 examples-readme.md
-rw-r--r-- 1 labex labex    1690 Mar 15 12:45 ansible-example.cfg

Давайте проверим, работает ли загруженный двоичный файл jq:

~/project/ansible-get-url/advanced-downloads/jq --version

Вы должны увидеть вывод, указывающий версию jq (например, jq-1.6), подтверждающий, что исполняемый файл был правильно загружен с правильной контрольной суммой.

Теперь вы успешно использовали различные расширенные опции модуля get_url для загрузки файлов с разными требованиями и ограничениями.

Реализация развертывания практического веб-приложения

Давайте применим то, что мы узнали, в более практическом сценарии: развертывание простого веб-приложения с использованием модуля get_url Ansible.

Настройка проекта веб-приложения

Сначала давайте создадим структуру каталогов для нашего веб-приложения:

mkdir -p ~/project/ansible-get-url/webapp/public
cd ~/project/ansible-get-url

Создание плейбука развертывания веб-приложения

Теперь мы создадим плейбук с именем deploy-webapp.yml, который будет загружать необходимые файлы для нашего веб-приложения:

---
- name: Deploy Web Application Files
  hosts: localhost
  become: no
  vars:
    webapp_dir: ~/project/ansible-get-url/webapp
    assets_base_url: https://raw.githubusercontent.com/ansible/ansible-documentation/devel/docs/docsite/rst/_static
  tasks:
    - name: Ensure webapp directories exist
      file:
        path: "{{ item }}"
        state: directory
        mode: "0755"
      loop:
        - "{{ webapp_dir }}"
        - "{{ webapp_dir }}/public"
        - "{{ webapp_dir }}/public/css"
        - "{{ webapp_dir }}/public/images"

    - name: Create index.html
      copy:
        dest: "{{ webapp_dir }}/public/index.html"
        content: |
          <!DOCTYPE html>
          <html>
          <head>
            <title>Ansible Demo App</title>
            <link rel="stylesheet" href="css/style.css">
          </head>
          <body>
            <div class="container">
              <h1>Welcome to Ansible Demo</h1>
              <p>This site was deployed using Ansible's get_url module!</p>
              <img src="images/ansible-logo.png" alt="Ansible Logo">
            </div>
          </body>
          </html>

    - name: Download CSS file
      get_url:
        url: "{{ assets_base_url }}/css/ansible.css"
        dest: "{{ webapp_dir }}/public/css/style.css"
        mode: "0644"
        timeout: 30
        retries: 3

    - name: Download Ansible logo
      get_url:
        url: "{{ assets_base_url }}/images/ansible_logo.svg"
        dest: "{{ webapp_dir }}/public/images/ansible-logo.png"
        mode: "0644"
        timeout: 30
        retries: 3

    - name: Install Python HTTP server
      apt:
        name: python3-http.server
        state: present
      become: yes

    - name: Display information about running the web server
      debug:
        msg: |
          Web application has been deployed!
          To start the web server, run:
          cd {{ webapp_dir }}/public && python3 -m http.server 8080
          Then access it at: http://localhost:8080

Этот плейбук:

  1. Создает необходимую структуру каталогов для нашего веб-приложения
  2. Создает файл index.html с базовым HTML-содержимым
  3. Загружает файл CSS и изображение логотипа Ansible с помощью модуля get_url
  4. Устанавливает HTTP-сервер Python
  5. Отображает информацию о том, как запустить веб-сервер

Запуск плейбука развертывания веб-приложения

Давайте выполним плейбук:

ansible-playbook deploy-webapp.yml

Вы должны увидеть вывод, указывающий на то, что веб-приложение было успешно развернуто.

Запуск веб-сервера

Теперь давайте запустим веб-сервер, чтобы протестировать наше развернутое приложение:

cd ~/project/ansible-get-url/webapp/public
python3 -m http.server 8080 &

Веб-сервер теперь работает в фоновом режиме на порту 8080. Если бы у вас была обычная среда с доступом к браузеру, вы могли бы получить доступ к веб-приложению по адресу http://localhost:8080.

Проверка развернутых файлов

Давайте проверим, что все необходимые файлы были развернуты правильно:

ls -la ~/project/ansible-get-url/webapp/public/

Вы должны увидеть файл index.html и каталоги, которые мы создали.

ls -la ~/project/ansible-get-url/webapp/public/css/

Здесь должен отображаться загруженный файл CSS.

ls -la ~/project/ansible-get-url/webapp/public/images/

Здесь должно отображаться загруженное изображение логотипа Ansible.

Просмотр содержимого HTML

Давайте проверим содержимое файла index.html:

cat ~/project/ansible-get-url/webapp/public/index.html

Вы должны увидеть содержимое HTML, которое мы создали в плейбуке.

Остановка веб-сервера

Когда вы закончите тестирование, вы можете остановить веб-сервер, найдя его идентификатор процесса и завершив его:

pkill -f "python3 -m http.server 8080"

Поздравляем! Вы успешно развернули простое веб-приложение, используя модуль get_url Ansible для загрузки необходимых файлов.

Резюме

В этом руководстве вы получили практический опыт использования модуля get_url Ansible для загрузки файлов с определенных URL-адресов. Вы узнали:

  • Как установить и настроить Ansible для локальной разработки
  • Как создавать базовые плейбуки, используя модуль get_url для загрузки файлов
  • Как использовать расширенные опции, такие как проверка контрольной суммы (checksum validation), тайм-ауты (timeouts), повторные попытки (retries) и условные загрузки (conditional downloads)
  • Как реализовать практический сценарий развертывания веб-приложения с использованием модуля get_url

Эти навыки являются основополагающими для автоматизации задач управления файлами в различных ИТ-операциях, включая развертывание программного обеспечения, управление контентом и настройку системы. Модуль get_url — это универсальный инструмент, который можно интегрировать в более сложные рабочие процессы Ansible для оптимизации процессов управления инфраструктурой.

Продолжая свой путь в Ansible, рассмотрите возможность изучения связанных модулей, таких как uri, unarchive и synchronize, которые дополняют модуль get_url для более комплексной автоматизации управления файлами.