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를 워크스테이션에 마운트하고 로컬로 복사하는 것입니다. 저는 이 방법을 피하고 싶습니다.
어떤 조언이라도 대단히 감사하겠습니다.
감사해요!
편집: 아래의 훌륭한 댓글 작성자에게 감사드립니다! 나는 제안된 대로 synchronize
Linux 워크스테이션에서 모듈을 사용할 수 있었습니다.
불행하게도 일부 워크스테이션에서는 Windows를 실행하므로 이 모듈을 사용할 수 없습니다. 현재 내가 취할 수 있는 유일한 실행 가능한 솔루션은 을 사용하는 것입니다. pscp
Ansible 전용을 유지하려면 사용을 피하고 싶습니다.
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