📜 Модуль копирования Ansible [объяснение с примерами]

Как копировать с Ansible

by itisgood

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

Вот некоторые распространенные сценарии использования.

  • Развертывание статического содержимого: Если у вас есть статический контент, такой как HTML, CSS, файлы JavaScript или другие активы, которые вы хотите развернуть на веб-серверах или серверах приложений, вы можете использовать модуль копирования для обеспечения того, чтобы эти файлы были скопированы в соответствующие места.
  • Развертывание ключевых файлов: Иногда вам может понадобиться распространить сертификаты SSL или ключи SSH на несколько серверов. Модуль копирования позволяет безопасно распространять эти файлы, сохраняя контроль над их разрешениями и правами собственности.
  • Пользовательские шаблоны: Вы можете использовать шаблоны Jinja2 с модулем копирования для динамического создания файлов конфигурации или других текстовых файлов на основе переменных или условий, специфичных для каждого управляемого узла.
  • Управление конфигурационными файлами: С помощью модуля копирования можно развернуть общий файл конфигурации для Nginx, Apache или любой другой службы на нескольких серверах.

Необходимые условия

Прежде чем приступить к работе, убедитесь, что у вас есть все необходимое:

  • Ansible установлен на вашем хосте управления.
  • Доступ к одному или нескольким целевым хостам, на которые вы хотите скопировать файлы.
  • Базовое понимание концепций Ansible, таких как инвентари, плейбуки и таски.

📜 Понимание основных компонентов Ansible – часть 1 – IT is good

Понимание модуля копирования Ansible

Модуль копирования Ansible предоставляет простой и эффективный способ распространения файлов и каталогов в вашей инфраструктуре.

Основной синтаксис модуля копирования показан ниже:

- name: Copy file from control node to managed node
  copy:
    src: /source-pth/file.txt
    dest: /destination-path/file.txt

Пояснения:

  • src: Указывает путь к исходному файлу на хосте управления Ansible.
  • dest: Указывает путь к целевому файлу или каталогу на удаленных хостах.

Теперь давайте рассмотрим несколько практических сценариев.

Практические примеры использования модуля copy Ansible

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

Пример 1: Распространение файлов конфигурации

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

Сначала создайте шаблон файла конфигурации Nginx (nginx.conf.j2), включающий переменные для имени домена.

Вот пример:

nano nginx.conf.j2
Добавьте следующую конфигурацию:
server {
    listen 80;
    server_name {{ domain_name }};
    root /var/www/{{ domain_name }};
    index index.html index.htm;

    access_log /var/log/nginx/{{ domain_name }}.log;
    error_log /var/log/nginx/{{ domain_name }}.log;

}

Далее создайте Ansible плейбук playbook.yml, который использует модуль copy для развертывания файла конфигурации Nginx на нескольких серверах и динамически задает имя домена с помощью переменных Ansible:

nano playbook.yml
Добавьте следующую конфигурацию:
---
- name: Deploy Nginx configuration file
  hosts: nginx_servers
  vars:
    nginx_conf_path: /etc/nginx/conf.d/
    domain_names:
      - site1.example.com
      - site2.example.com
      - site3.example.com
  tasks:
    - name: Copy Nginx configuration file
      copy:
        src: nginx.conf.j2
        dest: "{{ nginx_conf_path }}{{ item }}"
      with_items: "{{ domain_names }}"
Теперь запустите вышеупомянутый плейбук
ansible-playbook -i inventory_file playbook.yml

Замените inventory_file на файл инвентари Ansible, содержащий список удаленных серверов.

Этот плейбук развернет файл конфигурации Nginx (nginx.conf.j2) на каждом сервере в группе nginx_servers.

Модуль копирования динамически заменит переменную {{ domain_name }} в шаблоне на каждое доменное имя, указанное в переменной domain_names.

Это позволит вам развернуть различные конфигурации Nginx для разных доменных имен на нескольких серверах с помощью переменных Ansible.

Пример 2: Развертывание статического содержимого

Модуль копирования Ansible – отличный выбор для развертывания статического содержимого, такого как HTML, CSS, файлы JavaScript и другие активы на веб-серверах или серверах приложений.

Вот как можно использовать модуль копирования для обеспечения копирования этих файлов в соответствующие места:

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

nano playbook.yml
Добавьте следующую конфигурацию:
---
- name: Deploy static content to web servers
  hosts: web_servers
  become: yes
  become_user: root

  tasks:
    - name: Copy HTML files
      copy:
        src: /backup/html_files/
        dest: /var/www/html/
        owner: www-data
        group: www-data
        mode: '0755'


    - name: Copy CSS files
      copy:
        src: /backup/css_files/
        dest: /var/www/html/css/
        owner: www-data
        group: www-data
        mode: '0755'

    - name: Copy JavaScript files
      copy:
        src: /backup/js_files/
        dest: /var/www/html/js/
        owner: www-data
        group: www-data
        mode: '0755'

В этом плейбук:

  • web_servers – группа серверов, на которых вы хотите развернуть статический контент.
  • src – путь к локальной директории, содержащей файлы HTML, CSS и JavaScript.
  • dest – директория назначения на серверах, куда нужно скопировать файлы.

Теперь запустите сборник сценариев Ansible с помощью команды ansible-playbook:

ansible-playbook -i inventory_file playbook.yml
Замените inventory_file на файл инвентари Ansible, содержащий список удаленных серверов.

Пример 3: Развертывание файлов SSH и SSL

Модуль копирования Ansible используется для безопасного распространения конфиденциальных файлов, таких как сертификаты SSL, ключи SSH или другие учетные данные, на нескольких серверах, сохраняя при этом контроль над их разрешениями и правами собственности.

Сначала создайте файл playbook.yml.

nano playbook.yml
Добавьте следующую конфигурацию:
---
- name: Distribute SSL certificates and SSH keys
  hosts: all
  tasks:
    - name: Copy SSL certificate file
      copy:
        src: /ssl/ssl_certificate.crt
        dest: /etc/ssl/certs/ssl_certificate.crt
        mode: '0644'
        owner: root
        group: root

    - name: Copy SSL private key file
      copy:
        src: /ssl/ssl_private_key.key
        dest: /etc/ssl/private/ssl_private_key.key
        mode: '0600'
        owner: root
        group: root

    - name: Copy SSH private key file
      copy:
        src: /ssh/ssh_private_key
        dest: /home/{{ ansible_user }}/ssh/ssh_private_key
        mode: '0600'
        owner: "{{ ansible_user }}"
        group: "{{ ansible_user }}"

Вот пояснение к приведенному выше руководству.

Для сертификатов и ключей SSL мы устанавливаем соответствующие режимы файлов (0644 для сертификатов, 0600 для закрытых ключей) и права собственности (root:root).

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

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

Теперь запустите приведенный выше плейбук.

ansible-playbook -i inventory_file playbook.yml

Пример 4: Копирование файлов на удаленных серверах

Модуль copy обычно используется в Ansible для копирования файлов с узла управления Ansible на целевые узлы.

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

В этом случае вы можете использовать опцию remote_src вместе с модулем copy.

Допустим, у вас есть файл example.txt, расположенный на удаленном хосте по адресу /tmp/example.txt, и вы хотите скопировать его в другое место на том же хосте, скажем, в /var/tmp/.

Давайте создадим плейбук для выполнения этой задачи.

nano playbook.yml
Добавьте следующую конфигурацию.
- name: Copy example.txt to /var/tmp/
  hosts: your_target_host
  tasks:
    - name: Copy file from remote host to another location
      copy:
        src: /tmp/example.txt  
        dest: /var/tmp/example.txt  
        remote_src: yes

В этом примере:

  • src: Указывает исходный файл на удаленном хосте (/tmp/example.txt).
  • dest: Указывает файл назначения на удаленном хосте (/var/tmp/example.txt).
  • remote_src: yes: Указывает, что путь к исходному файлу является относительным по отношению к удаленному хосту.

Когда вы запустите этот плейбук Ansible, он скопирует example.txt из /tmp/example.txt на удаленном хосте в /var/tmp/example.txt на том же удаленном хосте.

Заключение

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

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

см. также:

You may also like

Leave a Comment