Python sao chép tập tin giữa các máy chủ

Làm cách nào để sao chép tệp giữa các máy chủ từ xa trong Ansible?. là mục đích đằng sau bài viết này. Bài viết nào tôi cũng đọc và góp ý cho tôi nhưng không có gì thiết thực. Tôi chỉ đơn giản là muốn tạo rsync ansible. Tôi muốn thực thi rsync giữa các máy chủ từ xa và sao chép tệp giữa các máy chủ từ xa

Vì vậy, đây là bài viết định hướng ví dụ. Trong bài đăng này, chúng ta sẽ thảo luận về hai tùy chọn chính có sẵn để sao chép các tệp giữa các máy chủ từ xa hoặc từ xa đến xa

Nói chung, khi chúng tôi muốn sao chép các tệp từ máy chủ này sang máy chủ khác, điều đầu tiên xuất hiện trong đầu chúng tôi là SCP và ansible có một mô-đun dành riêng cho cùng tên COPY

Nếu bạn muốn sao chép tệp từ Ansible Control Master sang máy chủ từ xa, mô-đun COPY [scp] sẽ ổn. Nhưng chúng tôi cần một cái gì đó nhiều hơn khi chúng tôi muốn sao chép các tệp giữa các máy chủ từ xa hoặc sao chép các tệp giữa điều khiển từ xa với điều khiển từ xa

Chúng tôi sẽ sử dụng một số mô-đun ansible như sao chép, tìm nạp, đồng bộ hóa để thực hiện yêu cầu sao chép tệp giữa các máy chủ trong ansible

Mặc dù chúng tôi đã biết mô-đun Ansible Copy được sử dụng để làm gì

Đây là phần giới thiệu đơn giản về Ansible Fetch và Ansible Synchronize

Ansible Fetch là kéo các tệp từ máy chủ từ xa đến máy điều khiển

Đồng bộ hóa Ansible được sử dụng để sao chép các tệp giữa các máy chủ từ xa [hoặc] máy chủ mục tiêu. Điều này giống như thực hiện RSYNC với sự trợ giúp của Ansible

 

Mục lục

Các Chỉ mục

  1. Kế hoạch / Yêu cầu
  2. Phương pháp1. Sao chép tệp giữa các máy chủ từ xa bằng mô-đun tìm nạp
  3. Phương pháp2. Sao chép tệp giữa các máy chủ từ xa bằng mô-đun đồng bộ hóa
    1. đồng bộ đẩy
    2. Đồng bộ kéo
  4. Đầu ra thực hiện
  5. Tài liệu tham khảo và các bài viết liên quan khác

 

Kế hoạch Plan / Yêu cầu

Để bắt đầu, chúng ta hãy tự xác định một số yêu cầu để chúng ta có thể liên hệ và thống nhất với nhau

Chúng tôi có hai máy chủ được đặt tên như sau

  1. mwiappi01
  2. mwiapp02

Yêu cầu là copy 1 file từ mwiapp01 sang mwiapp02. Trước khi chúng tôi tiếp tục, Đây là sơ đồ cơ sở hạ tầng thiết lập của chúng tôi

Đừng nhầm lẫn với cái tên Master. Nó chỉ là một máy điều khiển. Hãy nhớ  Ansible ít tác nhân hơn. vì vậy không có chủ và nô lệ

 

 

Phương thức 1. Sao chép từ app01 sang app02 bằng cách sử dụng mô-đun tìm nạp module

KHÔNG cần xác thực SSH giữa các nút từ xa cho phương pháp này

Đây là tùy chọn tốt nhất và dễ dàng nhất để truyền tệp giữa các nút từ xa Khi bạn không bật Xác thực dựa trên khóa SSH giữa các nút từ xa. Mặc dù vậy, đó không phải là [hoặc] con đường ngắn nhất. Nó hoạt động tốt khi trọng tâm chính của chúng tôi là hoàn thành công việc cho dù phương pháp có thể là gì

đó là một quá trình gồm hai bước khi nói đến phương pháp này

Bước 1. Tìm nạp tệp từ máy chủ từ xa [nguồn] về chủ ansible

Bước 2. Đẩy [Sao chép] tệp từ máy chủ ansible sang máy chủ từ xa [đích]

Ở đây, chủ hoạt động như một bộ đệm nơi các tệp được lưu trữ tạm thời và sau đó được chuyển

Hãy xem xét vở kịch sau đây thực hiện cả hai nhiệm vụ nêu trên

---
 - hosts: app
   tasks:
     - name: Fetch the file from the mwiapp01 to master
       run_once: yes
       fetch: src=/tmp/app01-to-app02.jar dest=buffer/ flat=yes
       when: "{{ inventory_hostname == 'mwiapp01' }}"

     - name: Copy the file from master to mwiapp02
       copy: src=buffer/app01-to-app02.jar dest=/tmp/
       when: "{{ inventory_hostname == 'mwiapp02' }}"

ở đây chúng tôi sử dụng "when" để thực hiện việc thực thi dựa trên điều kiện và inventory_hostname là biến tích hợp ansible sẽ chỉ ra tên máy chủ từ xa thực thi hiện tại

Đôi khi bạn có thể cần sử dụng ansible_hostname thay cho inventory_hostname

Hãy đọc bài viết này để biết sự khác biệt giữa ansible_hostname và inventory_hostname

Về cơ bản, chúng tôi đang hướng dẫn Ansible chỉ thực thi tác vụ Tìm nạp trên máy chủ mwiapp01 và chỉ sao chép tác vụ khi

---
- name: Sync Pull task - Executed on  the Destination host "{{groups['app'][1]}}"
  hosts: "{{groups['app'][0]}}"
  user: wlsusr
  tasks:   
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull
      tags: sync-pull
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: pull
      delegate_to: "{{groups['app'][1]}}"
      register: syncfile
      run_once: true
      with_items:
       - "/tmp/app01-to-app02.jar"
0 là máy chủ thực thi từ xa hiện tại


 

Phương pháp 2.   Sao chép từ ứng dụng01 sang ứng dụng02 bằng mô-đun  đồng bộ hóa module

Xác thực dựa trên khóa SSH phải được bật giữa các máy chủ từ xa

Để mô-đun Đồng bộ hóa hoạt động dễ dàng, xác thực dựa trên Khóa SSH phải được bật giữa các nút từ xa. nếu không, tác vụ đồng bộ hóa sẽ bị kẹt và trò chơi Ansible của bạn cũng vậy

Nói cách khác, các nút từ xa sẽ có thể đăng nhập vào nhau mà không cần phải nhập mật khẩu theo cách thủ công. Chúng tôi đạt được điều này chủ yếu nhờ sự trợ giúp của khóa SSH

Như đã nói trước đó. Đồng bộ hóa Ansible giống Ansible RSYNC hơn. tính năng rsync điển hình của Linux

Để biết cách bật Xác thực dựa trên khóa chỉ trong vài giây, hãy tham khảo bài viết sau

Kích hoạt xác thực dựa trên Khóa SSH bằng Ansible

Khi chúng tôi đã sẵn sàng với xác thực dựa trên Khóa SSH. Chúng tôi đã sẵn sàng để chơi vở kịch. [vở kịch]

Có hai phương pháp để sao chép tệp bằng mô-đun Đồng bộ hóa

  1. Đồng bộ kéo
  2. đồng bộ đẩy

Xem xét các playbook sau sao chép tệp từ mwiapp01 sang

---
- name: Sync Pull task - Executed on  the Destination host "{{groups['app'][1]}}"
  hosts: "{{groups['app'][0]}}"
  user: wlsusr
  tasks:   
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull
      tags: sync-pull
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: pull
      delegate_to: "{{groups['app'][1]}}"
      register: syncfile
      run_once: true
      with_items:
       - "/tmp/app01-to-app02.jar"
0 bằng cả phương pháp Đồng bộ hóa Kéo và Đồng bộ hóa Đẩy

 

 

Đồng bộ hóa Kéo

Nhắm mục tiêu đến. Máy chủ nguồn [mwiapp01]

Được ủy quyền và thực hiện trên. Máy chủ đích [mwiapp02]

Giải trình. Vì nó đang được thực thi trong máy chủ đích nơi tệp phải đến. Nhiệm vụ là kéo tệp từ máy chủ nguồn gốc [hoặc]

 

Đây là playbook được thực thi trên máy chủ đích

---
- name: Sync Pull task - Executed on  the Destination host "{{groups['app'][1]}}"
  hosts: "{{groups['app'][0]}}"
  user: wlsusr
  tasks:   
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull
      tags: sync-pull
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: pull
      delegate_to: "{{groups['app'][1]}}"
      register: syncfile
      run_once: true
      with_items:
       - "/tmp/app01-to-app02.jar"
0  với sự trợ giúp của ủy quyền và
---
- name: Sync Pull task - Executed on  the Destination host "{{groups['app'][1]}}"
  hosts: "{{groups['app'][0]}}"
  user: wlsusr
  tasks:   
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull
      tags: sync-pull
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: pull
      delegate_to: "{{groups['app'][1]}}"
      register: syncfile
      run_once: true
      with_items:
       - "/tmp/app01-to-app02.jar"
5 tệp từ mwiapp01 đến mwiapp02

---
- name: Sync Pull task - Executed on  the Destination host "{{groups['app'][1]}}"
  hosts: "{{groups['app'][0]}}"
  user: wlsusr
  tasks:   
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull
      tags: sync-pull
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: pull
      delegate_to: "{{groups['app'][1]}}"
      register: syncfile
      run_once: true
      with_items:
       - "/tmp/app01-to-app02.jar"

 

Bạn có thể nghĩ rằng playbook được thiết lập để thực thi trên máy chủ đầu tiên vì lệnh

---
- name: Sync Pull task - Executed on  the Destination host "{{groups['app'][1]}}"
  hosts: "{{groups['app'][0]}}"
  user: wlsusr
  tasks:   
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull
      tags: sync-pull
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: pull
      delegate_to: "{{groups['app'][1]}}"
      register: syncfile
      run_once: true
      with_items:
       - "/tmp/app01-to-app02.jar"
6 đang nhắm mục tiêu vào máy chủ đầu tiên.
---
- name: Sync Pull task - Executed on  the Destination host "{{groups['app'][1]}}"
  hosts: "{{groups['app'][0]}}"
  user: wlsusr
  tasks:   
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull
      tags: sync-pull
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: pull
      delegate_to: "{{groups['app'][1]}}"
      register: syncfile
      run_once: true
      with_items:
       - "/tmp/app01-to-app02.jar"
7 mwiapp01

Nhưng bạn phải lưu ý rằng chúng tôi thực sự đang thực hiện nhiệm vụ này trên máy chủ thứ hai

---
- name: Sync Pull task - Executed on  the Destination host "{{groups['app'][1]}}"
  hosts: "{{groups['app'][0]}}"
  user: wlsusr
  tasks:   
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull
      tags: sync-pull
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: pull
      delegate_to: "{{groups['app'][1]}}"
      register: syncfile
      run_once: true
      with_items:
       - "/tmp/app01-to-app02.jar"
8 với sự trợ giúp của
---
- name: Sync Pull task - Executed on  the Destination host "{{groups['app'][1]}}"
  hosts: "{{groups['app'][0]}}"
  user: wlsusr
  tasks:   
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull
      tags: sync-pull
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: pull
      delegate_to: "{{groups['app'][1]}}"
      register: syncfile
      run_once: true
      with_items:
       - "/tmp/app01-to-app02.jar"
9

Xem Bản ghi màn hình sau đây để hiểu rõ hơn về điều này

 

 

Đồng bộ hóa Đẩy

Nhắm mục tiêu đến. Máy chủ đích [mwiapp02]

Được ủy quyền và thực hiện trên. Máy chủ nguồn [mwiapp01]

Giải trình. Vì nó đang được thực thi trong máy chủ nguồn nơi tệp đã có sẵn. Nhiệm vụ là đẩy tệp đến máy chủ đích

Đây là playbook được thực thi trên máy chủ nguồn mwiapp01 và


- name: Sync Push task - Executed on source host "{{groups['app'][0]}}"
  hosts: "{{groups['app'][1]}}" 
  user: wlsusr
  tasks:
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Push
      tags: sync-push
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: push
      delegate_to: "{{groups['app'][0]}}"
      register: syncfile
      with_items:
       - "/tmp/app01-to-app02.jar"
1 tệp từ 01 đến 02


- name: Sync Push task - Executed on source host "{{groups['app'][0]}}"
  hosts: "{{groups['app'][1]}}" 
  user: wlsusr
  tasks:
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Push
      tags: sync-push
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: push
      delegate_to: "{{groups['app'][0]}}"
      register: syncfile
      with_items:
       - "/tmp/app01-to-app02.jar"

 

Bạn có thể nghĩ rằng playbook được thiết lập để thực thi trên máy chủ thứ hai vì lệnh

---
- name: Sync Pull task - Executed on  the Destination host "{{groups['app'][1]}}"
  hosts: "{{groups['app'][0]}}"
  user: wlsusr
  tasks:   
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull
      tags: sync-pull
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: pull
      delegate_to: "{{groups['app'][1]}}"
      register: syncfile
      run_once: true
      with_items:
       - "/tmp/app01-to-app02.jar"
6 đang nhắm mục tiêu vào máy chủ đầu tiên.

- name: Sync Push task - Executed on source host "{{groups['app'][0]}}"
  hosts: "{{groups['app'][1]}}" 
  user: wlsusr
  tasks:
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Push
      tags: sync-push
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: push
      delegate_to: "{{groups['app'][0]}}"
      register: syncfile
      with_items:
       - "/tmp/app01-to-app02.jar"
3 mwiapp02

Nhưng bạn phải lưu ý rằng chúng tôi thực sự đang thực hiện nhiệm vụ này trên máy chủ đầu tiên mwiapp01 với sự trợ giúp của

---
- name: Sync Pull task - Executed on  the Destination host "{{groups['app'][1]}}"
  hosts: "{{groups['app'][0]}}"
  user: wlsusr
  tasks:   
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull
      tags: sync-pull
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: pull
      delegate_to: "{{groups['app'][1]}}"
      register: syncfile
      run_once: true
      with_items:
       - "/tmp/app01-to-app02.jar"
9

Playbook được tạo thành từ hai danh sách nhiệm vụ dựa trên máy chủ. Lần chạy đầu tiên bằng cách sử dụng Đồng bộ hóa kéo sẽ chạy vào ngày

---
- name: Sync Pull task - Executed on  the Destination host "{{groups['app'][1]}}"
  hosts: "{{groups['app'][0]}}"
  user: wlsusr
  tasks:   
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull
      tags: sync-pull
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: pull
      delegate_to: "{{groups['app'][1]}}"
      register: syncfile
      run_once: true
      with_items:
       - "/tmp/app01-to-app02.jar"
0và lần chạy thứ hai với Đồng bộ hóa đẩy sẽ chạy vào ngày mwiapp01

Mặc dù playbook là dễ hiểu [dễ hiểu]. Tôi cảm thấy có một số dòng đặc biệt cần được giải thích thêm, chẳng hạn như 


- name: Sync Push task - Executed on source host "{{groups['app'][0]}}"
  hosts: "{{groups['app'][1]}}" 
  user: wlsusr
  tasks:
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Push
      tags: sync-push
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: push
      delegate_to: "{{groups['app'][0]}}"
      register: syncfile
      with_items:
       - "/tmp/app01-to-app02.jar"
8

Nó đại diện cho phần tử đầu tiên  [hoặc] máy chủ của nhóm máy chủ có tên là “ứng dụng” giống như một mảng

Hy vọng hình ảnh sau đây sẽ làm cho nó rõ ràng

Hai dòng quan trọng khác trong tệp như sau

  • chế độ  Nó đại diện cho mô hình Đồng bộ hóa. Đồng bộ hóa kéo hoặc Đồng bộ hóa đẩy
  • delegate_to Nó báo cho ansible, nơi mà lệnh [hoặc] tác vụ sẽ thực sự được thực thi

Hy vọng bạn có thể đã có nó bây giờ.

---
- name: Sync Pull task - Executed on  the Destination host "{{groups['app'][1]}}"
  hosts: "{{groups['app'][0]}}"
  user: wlsusr
  tasks:   
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull
      tags: sync-pull
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: pull
      delegate_to: "{{groups['app'][1]}}"
      register: syncfile
      run_once: true
      with_items:
       - "/tmp/app01-to-app02.jar"
9 và
---
- name: Sync Pull task - Executed on  the Destination host "{{groups['app'][1]}}"
  hosts: "{{groups['app'][0]}}"
  user: wlsusr
  tasks:   
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull
      tags: sync-pull
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: pull
      delegate_to: "{{groups['app'][1]}}"
      register: syncfile
      run_once: true
      with_items:
       - "/tmp/app01-to-app02.jar"
6  cùng với rsync1 trong ansible-playbook, hoạt động cùng nhau để thực hiện [hoặc] sao chép từ xa giữa các nút từ xa

 

Đầu ra thực hiện

Trong ảnh chụp màn hình trước, chúng tôi đã thực hiện 3 lệnh. Cái đầu tiên và cái cuối cùng là một lệnh đặc biệt của Ansible để kiểm tra tính khả dụng của tệp trong thư mục rsync2 trong máy chủ

---
- name: Sync Pull task - Executed on  the Destination host "{{groups['app'][1]}}"
  hosts: "{{groups['app'][0]}}"
  user: wlsusr
  tasks:   
    - name: Copy the file from mwiapp01 to mwiapp02 using Method Pull
      tags: sync-pull
      synchronize:
        src: "{{ item }}"
        dest: "{{ item }}"
        mode: pull
      delegate_to: "{{groups['app'][1]}}"
      register: syncfile
      run_once: true
      with_items:
       - "/tmp/app01-to-app02.jar"
0

chúng tôi sử dụng rsync4 để thực thi lệnh chỉ trong một máy chủ, mặc dù chúng tôi sử dụng nhóm máy chủ chứa hai máy chủ

chúng tôi đã sao chép thành công một tệp từ mwiapp01 sang mwiapp02  bằng cách sử dụng cả Tìm nạpĐồng bộ hóa modules.

 

Phần kết luận

Trong bài đăng này, chúng tôi đã học và thực hiện thành công cách sao chép tệp giữa các máy chủ từ xa bằng cách sử dụng các mô-đun sao chép và tìm nạp ansible. Chúng tôi đã học được hai phương pháp để sao chép tệp giữa các máy chủ bằng cách sử dụng ansible

Hy vọng bạn thấy bài viết này hữu ích

 

Tài liệu tham khảo và các bài viết liên quan khác

  1. Tham chiếu mô-đun Ansible Copy
  2. Tham chiếu mô-đun Ansible Fetch
  3. Tham chiếu mô-đun Đồng bộ hóa Ansible
  4. Cách sao chép hoặc trao đổi khóa SSH giữa nhiều máy chủ – Ansible
  5. Cách trao đổi IP và cập nhật tệp /etc/hosts trên nhiều máy chủ – Ansible

 

Hy vọng bài viết này sẽ giúp. Nếu bạn thích câu chuyện này xin hay chia sẻ nó

 

Thanks,
Sarav AK

Theo dõi chúng tôi trên Facebook hoặc Twitter
Để biết thêm các video và hướng dẫn thực tế. Hãy đăng ký theo dõi kênh của chúng tôi
Theo dõi tôi trên Linkedin Hồ sơ của tôi
Đối với bất kỳ tư vấn hoặc thuê chúng tôi
Nếu bạn thích bài viết này. Thể hiện sự hỗ trợ của bạn. Mua cho tôi một ly cà phê

Đăng ký nội dung độc quyền "chỉ dành cho người đăng ký"

Tên*

E-mail*

Thêm từ Khoảng không quảng cáo phần mềm trung gian

  • cập nhật ansible /etc/hosts với IP của tất cả các máy chủ trên tất cả các máy chủ

    Trong Ansible, Giao tiếp SSH là tất cả. Hãy để nó được kết nối với các máy chủ từ xa từ máy tính xách tay/máy tính để bàn [mac/windows] của bộ điều khiển của bạn hoặc để kích hoạt kết nối giữa các máy chủ trong nhóm Máy chủ. Đặc biệt, đây sẽ là một nhiệm vụ to lớn cần hoàn thành khi bạn không có DNS  nơi mỗi máy chủ từ xa có thể dễ dàng…

  • Ansible nhận địa chỉ IP của máy chủ hoặc mục tiêu hiện tại

    Cách lấy địa chỉ IP của máy chủ hiện tại hoặc máy chủ từ xa trong Ansible. Đó là câu hỏi, bài viết này sẽ giải quyết. Trong khi chạy Playbook, bạn có thể có một yêu cầu mà bạn cần lấy địa chỉ IP của máy chủ từ xa hiện tại và được kết nối. Có…

  • Ansible lineinfile nhiều dòng - Thay thế nhiều dòng. Giao lộ Devops

    Trong bài đăng này, chúng ta sẽ xem cách sử dụng mô-đun Ansible lineinfile để thay thế nhiều Dòng cùng một lúc. Cách sử dụng nhiều biểu thức chính quy hoặc Regex cùng một lúc. Cách khớp nhiều dòng. Đối với ví dụ này, chúng tôi sẽ sử dụng apache httpd. tập tin conf…

  • ansible tìm kiếm chuỗi trong tệp hoặc kiểm tra xem chuỗi có tồn tại trong tệp không

    Mục tiêu của bài đăng này là chỉ ra cách tìm kiếm một chuỗi trong một tệp với ansible. ansible cung cấp nhiều cách khác nhau để thực hiện cùng một. Chúng tôi sẽ đề cập đến ba cách chính để tìm kiếm một chuỗi trong một tệp. Mô-đun Lineinfile Sử dụng mô-đun Shell và lệnh grep…

  • Ansible Khởi động lại hệ thống và đợi khởi động lại để hoàn tất

    Mục tiêu Mục đích của bài đăng này là giải thích bằng một ví dụ về cách ansible bắt đầu khởi động lại và đợi quá trình khởi động lại hoàn tất. Có những trường hợp chúng tôi muốn các nút từ xa của mình được khởi động lại hoặc khởi động lại. Ví dụ: Lấy Bản vá làm ví dụ. Như là một phần…

Chủ Đề