Ansible - 한 원격 노드에서 다른 원격 노드로 파일 가져오기

Ansible - 한 원격 노드에서 다른 원격 노드로 파일 가져오기

Ansible을 사용하여 로컬 워크스테이션에서 NAS 서버로 파일을 업로드하고 싶습니다. 둘 다 Ansible을 통해 관리됩니다.

지금까지 이 기능을 달성한 유일한 방법은 NFS를 통해 NAS 파일 공유를 로컬 디렉터리로 마운트하고 복사 작업을 Ansible 컨트롤러에 위임하는 것입니다.

  - name: Fetch files to NAS
    fetch:
      src: "{{ item.path }}"
      dest: "/NAS/Share/{{inventory_hostname}}/" #<local NFS mount
      flat: yes
      validate_checksum: yes
    with_items: "{{ found_files.files }}"

그러나 이 솔루션은 속도가 느리고 오류가 발생하기 쉽습니다. 또한 Ansible 타워를 사용해 보고 싶은데 이 솔루션이 전혀 작동하지 않을 것 같습니다.

Ansible을 통해 이 작업을 자동화할 수 있습니까? 제가 생각할 수 있는 유일한 해결책은 NAS를 워크스테이션에 마운트하고 로컬로 복사하는 것입니다. 저는 이 방법을 피하고 싶습니다.

어떤 조언이라도 대단히 감사하겠습니다.

감사해요!

편집: 아래의 훌륭한 댓글 작성자에게 감사드립니다! 나는 제안된 대로 synchronizeLinux 워크스테이션에서 모듈을 사용할 수 있었습니다.

불행하게도 일부 워크스테이션에서는 Windows를 실행하므로 이 모듈을 사용할 수 없습니다. 현재 내가 취할 수 있는 유일한 실행 가능한 솔루션은 을 사용하는 것입니다. pscpAnsible 전용을 유지하려면 사용을 피하고 싶습니다.

Windows 워크스테이션에서 NAS로 파일을 추출하는 데 사용할 수 있는 다른 방법이 있습니까?

감사해요!

답변1

더 많은 옵션이 있습니다. 예를 들어동기화또는SCP

동기화

모듈 사용동기화가능하다면:

  • 설치하다동기화NAS 및 워크스테이션에서. 바라보다노트.
  • NAS에서 워크스테이션으로 비밀번호 없는 SSH를 구성합니다.

예를 들어 테스트용 프로젝트를 만듭니다.

shell> tree .
.
├── ansible.cfg
├── group_vars
│   └── all
│       └── nas.yml
├── hosts
└── pb.yml

2 directories, 4 files
shell> cat ansible.cfg 
[defaults]
gathering = explicit
collections_path = $HOME/.local/lib/python3.9/site-packages/
inventory = $PWD/hosts
roles_path = $PWD/roles
remote_tmp = ~/.ansible/tmp
retry_files_enabled = false
stdout_callback = yaml

변수 선언 및 맞춤설정

shell> cat group_vars/all/nas.yml 
---

# Customize below variables - - - - - - - - - - - - - - - - - - - - - -

# Resolvable host or IP
nas_host: "{{ hostvars[nas].ansible_host }}"

# Workstation user who can read the files
wrks_admin: admin

# NAS user who runs the upload script
nas_admin: admin

# Directory at controller keeps the public keys of nas_admin
nas_dir_pub_keys: /tmp/nas_pub_keys

# Directory at NAS to upload the files to
nas_dir_share: /tmp/ansible/share

# Script at NAS run by nas_admin to upload the files
nas_upload_script: /tmp/nas_upload_script.bash

# List of files to upload from the workstations to NAS
nas_upload:
  - /etc/passwd


# Do not change this - - - - - - - - - - - - - - - - - - - - - - - - -

# The variable wrks keeps the comma-separated list of
# worstations. Create a list of the workstations
nas_wrks: "{{ wrks.split(',') }}"

# Public key of nas_admin stored at controller
nas_key: "{{ nas_dir_pub_keys }}/{{ nas }}/home/{{ nas_admin }}/.ssh/id_rsa.pub"

NAS 서버 및 워크스테이션의 인벤토리 생성

shell> cat hosts 
[nas]
nas_4 ansible_host=10.1.0.74

[nas:vars]
ansible_connection=ssh
ansible_user=admin
ansible_become=true
ansible_python_interpreter=/bin/python3.6

[wrks]
wrks_1 ansible_host=10.1.0.61
wrks_2 ansible_host=10.1.0.17
wrks_3 ansible_host=10.1.0.63

[wrks:vars]
ansible_connection=ssh
ansible_user=admin
ansible_become=true
ansible_python_interpreter=/usr/local/bin/python3.8
ansible_perl_interpreter=/usr/local/bin/perl

스크립트 만들기

shell> cat pb.yml 
---

# Mandatory variables:
#
#   nas ... NAS server
#   wrks .. Workstations; comma-separated list

- name: NAS ready
  hosts: "{{ nas }}"
  tasks:
    - fetch:
        src: "/home/{{ nas_admin }}/.ssh/id_rsa.pub"
        dest: "{{ nas_dir_pub_keys }}"
    - file:
        state: directory
        path: "{{ nas_dir_share }}/{{ item }}"
        owner: "{{ nas_admin }}"
      loop: "{{ nas_wrks }}"
    - copy:
        dest: "{{ nas_upload_script }}"
        content: |
          {{ '#' }}!/usr/bin/bash
          {% for host in nas_wrks %}
          {% set wrks_host = hostvars[host].ansible_host %}
          {% for file in nas_upload %}
          scp {{ wrks_admin }}@{{ wrks_host }}:{{ file }} {{ nas_dir_share }}/{{ host }}
          {% endfor %}
          {% endfor %}
        owner: "{{ nas_admin }}"
        mode: "u+x"

- name: Workstations ready
  hosts: "{{ wrks }}"
  tasks:
    - authorized_key:
        user: "{{ wrks_admin }}"
        key: "{{ lookup('file', nas_key) }}"

- name: Workstations upload files to NAS
  hosts: "{{ wrks }}"
  tasks:
    - synchronize:
        mode: pull
        src: "{{ item }}"
        dest: "{{ nas_dir_share }}/{{ inventory_hostname }}"
        checksum: true
      delegate_to: "{{ nas }}"
      loop: "{{ nas_upload }}"
      register: out
      become_user: "{{ nas_admin }}"
    - debug:
        var: out
      when: debug|d(false)|bool

추가 변수를 사용하여 플레이북 실행

shell> ansible-playbook pb.yml -e nas=nas_4 -e wrks=wrks_2,wrks_3

첫 번째 연극에서NAS ready:

  • 공개 키NAS 관리자존재하다나스컨트롤러에 저장됨
shell> tree -a /tmp/nas_pub_keys/
/tmp/nas_pub_keys/
└── nas_4
    └── home
        └── admin
            └── .ssh
                └── id_rsa.pub

4 directories, 1 file
  • 목차nas_dir_share모든 워크스테이션에 적합워커내장나스
nas_4> ssh [email protected] tree /tmp/ansible/share
tmp/ansible/share/
├── wrks_2
└── wrks_3
2 directories, 0 files
  • 또는 NAS의 명령줄에서 파일을 업로드하는 스크립트를 만드십시오.

두 번째 드라마에서Workstations ready:

  • 공개 키 추가NAS 관리자존재하다나스도착하다인증 키~의wrks_admin모든 워크스테이션에서워커

세 번째 드라마에서Workstations upload files to NAS:

  • 목록에서 파일 가져오기nas_upload워크스테이션에서나스
  • (선택사항) 등록 결과를 표시합니다.

스크립트 실행

shell> ansible-playbook pb.yml -e nas=nas_4 -e wrks=wrks_2,wrks_3

PLAY [NAS ready] *****************************************************************************

TASK [fetch] *********************************************************************************
changed: [nas_4]

TASK [file] **********************************************************************************
changed: [nas_4] => (item=wrks_2)
changed: [nas_4] => (item=wrks_3)

TASK [copy] **********************************************************************************
ok: [nas_4]

PLAY [Workstations ready] ********************************************************************

TASK [authorized_key] ************************************************************************
ok: [wrks_3]
ok: [wrks_2]

PLAY [Workstations upload files to NAS] ******************************************************

TASK [synchronize] ***************************************************************************
changed: [wrks_2 -> nas_4(10.1.0.74)] => (item=/etc/passwd)
changed: [wrks_3 -> nas_4(10.1.0.74)] => (item=/etc/passwd)

TASK [debug] *********************************************************************************
skipping: [wrks_2]
skipping: [wrks_3]

PLAY RECAP ***********************************************************************************
nas_4: ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
wrks_2: ok=2    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
wrks_3: ok=2    changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

목록의 파일nas_upload워크스테이션에서 복사되었습니다.워커도착하다nas_dir_share존재하다나스

nas_4> tree /tmp/ansible/share/
/tmp/ansible/share/
├── wrks_2
│   └── passwd
└── wrks_3
    └── passwd

2 directories, 2 files

SCP

스크립트 사용nas_upload_script만약 너라면:

  • NAS 및 워크스테이션에 rsync를 설치할 수 없습니다. 하지만 당신은
  • NAS에서 워크스테이션으로의 비밀번호 없는 SSH를 구성할 수 있습니다.
admin@nas_4> cat /tmp/nas_upload_script.bash 
#!/usr/bin/bash
scp [email protected]:/etc/passwd /tmp/ansible/share/wrks_2
scp [email protected]:/etc/passwd /tmp/ansible/share/wrks_3

세 번째 재생 건너뛰기 및 스크립트 실행나스명령줄에서

admin@nas_4> /tmp/nas_upload_script.bash 
passwd                                  100% 2958   595.8KB/s   00:00    
passwd                                  100% 1708   375.5KB/s   00:00

노트:

  • NAS에 Ansible을 설치할 수 있는 경우 쉬운 옵션은 NAS에서 게임을 실행하는 것입니다.

  • 다음을 위한 스크립트를 생성할 수도 있습니다.동기화NAS 명령줄의 파일

  • 가치NAS 관리자그리고wrks_admin와 다를 수 있습니다ansible_user

  • 복사첫 번째 게임에서는 선택 사항입니다. 스크립트가 필요하지 않은 경우 삭제할 수 있습니다.

답변2

rsync 작업에 Ansible 동기화 모듈을 사용할 수 있습니다. 업데이트되지 않은 파일이 있을 경우 복사 속도가 빨라져 전송되지 않을 수 있습니다.
https://docs.ansible.com/ansible/latest/collections/ansible/posix/synchronize_module.html

관련 정보