원격 시스템에서 Ansible 모듈을 사용하여 파일 / 디렉토리를 어떻게 이동 / 이름 바꾸기 할 수 있습니까? 명령 / 쉘 작업을 사용하고 싶지 않으며 로컬 시스템에서 원격 시스템으로 파일을 복사하고 싶지 않습니다.
원격 시스템에서 Ansible 모듈을 사용하여 파일 / 디렉토리를 어떻게 이동 / 이름 바꾸기 할 수 있습니까? 명령 / 쉘 작업을 사용하고 싶지 않으며 로컬 시스템에서 원격 시스템으로 파일을 복사하고 싶지 않습니다.
답변:
파일 모듈은 원격 시스템의 파일을 복사하지 않습니다. src 매개 변수는 파일에 대한 심볼릭 링크를 작성할 때 파일 모듈에서만 사용됩니다.
원격 시스템에서 파일을 완전히 이동하거나 이름을 바꾸려면 명령 모듈을 사용하여 적절한 명령을 호출하는 것이 가장 좋습니다.
- name: Move foo to bar
command: mv /path/to/foo /path/to/bar
화려하고 싶다면 먼저 stat 모듈을 사용하여 foo가 실제로 존재하는지 확인할 수 있습니다.
- name: stat foo
stat: path=/path/to/foo
register: foo_stat
- name: Move foo to bar
command: mv /path/to/foo /path/to/bar
when: foo_stat.stat.exists
removes
받는 옵션 command
모듈 (문서화 된 여기이 )? 이 옵션은 Ansible을 먼저 확인하는 것으로 보입니다.
removes: /path/to/foo
및 creates: /path/to/bar
. @Fonant는 이미 이것을 다른 답변에 대한 의견으로 언급했지만 이것이 허용되는 답변이므로 다시 지적하고 싶습니다.
버전 2.0 에서는 복사 모듈 에서 remote_src
매개 변수 를 사용할 수 있습니다 .
경우 True
그것은 SRC의 원격 / 대상 컴퓨터로 이동합니다.
- name: Copy files from foo to bar
copy: remote_src=True src=/path/to/foo dest=/path/to/bar
파일을 이동하려면 파일 모듈로 오래된 파일을 삭제해야합니다
- name: Remove old files foo
file: path=/path/to/foo state=absent
버전 2.8부터 복사 모듈 remote_src
은 재귀 복사를 지원합니다.
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
명령 모듈에서 작성 옵션이 유용하다는 것을 알았습니다. 이건 어때요:
- name: Move foo to bar
command: creates="path/to/bar" mv /path/to/foo /path/to/bar
Bruce P가 제안한 것과 같은 통계를 사용하여 2 가지 작업 방식을 사용했습니다. 이제 나는 이것을 하나의 작업으로 만듭니다. 나는 이것이 훨씬 명확하다고 생각합니다.
command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
나에게 잘 맞는 다른 옵션은 동기화 모듈을 사용하는 것입니다 . 그런 다음 파일 모듈을 사용하여 원래 디렉토리를 제거하십시오.
다음은 문서의 예입니다.
- synchronize:
src: /first/absolute/path
dest: /second/absolute/path
archive: yes
delegate_to: "{{ inventory_hostname }}"
dest
디렉토리가 동일한 시스템에 있더라도 SSH를 통해 액세스 되므로 모든 경우에 로컬로 작동하지 않습니다 .
이것을 달성하는 또 다른 방법은을 사용 file
하는 것 state: hard
입니다.
이것은 내가 일 해야하는 예입니다.
- name: Link source file to another destination
file:
src: /path/to/source/file
path: /target/path/of/file
state: hard
로컬 호스트 (OSX)에서만 테스트되었지만 Linux에서도 작동합니다. 나는 Windows를 말할 수 없다.
절대 경로가 필요합니다. 그렇지 않으면 링크를 만들 수 없습니다. 또한 파일 시스템을 교차 할 수 없으므로 마운트 된 매체 작업이 실패 할 수 있습니다.
이후에 소스 파일을 제거하면 하드 링크는 이동하는 것과 매우 유사합니다.
- name: Remove old file
file:
path: /path/to/source/file
state: absent
또 다른 이점은 플레이 도중에도 변경 사항이 유지된다는 것입니다. 따라서 누군가 소스를 변경하면 변경 사항이 대상 파일에 반영됩니다.
를 통해 파일에 대한 링크 수를 확인할 수 있습니다 ls -l
. 하드 링크 수는 모드 옆에 표시됩니다 (예 : 파일에 2 개의 링크가있는 경우 rwxr-xr-x 2).
Bruce는 파일이 이미 존재하는 경우 파일 이동 여부를 확인하기 위해 대상을 지정하려고 시도하지 않았습니다. 그는 mv를 시도하기 전에 이동할 파일이 실제로 존재하는지 확인했습니다.
Tom 's와 같은 관심사가 파일이 존재하지 않는 경우에만 이동하는 것이라면 Bruce의 수표를 여전히 믹스에 통합해야한다고 생각합니다.
- name: stat foo
stat: path=/path/to/foo
register: foo_stat
- name: Move foo to bar
command: creates="path/to/bar" mv /path/to/foo /path/to/bar
when: foo_stat.stat.exists
이것이 나를 위해 일한 방식입니다.
Tasks:
- name: checking if the file 1 exists
stat:
path: /path/to/foo abc.xts
register: stat_result
- name: moving file 1
command: mv /path/to/foo abc.xts /tmp
when: stat_result.stat.exists == True
위의 플레이 북에서 파일을 tmp 폴더로 이동하기 전에 abc.xts 파일이 있는지 확인합니다.
when: stat_result.stat.exists == True
. 사용하는 것만으로도 when: stat_result.stat.exists
충분합니다.
== True
파일을 찾을 수 없을 때 항상 무언가를하고 있기 때문에 보통을 사용합니다 == False
.
stat
따르면 값을 exists
반환 boolean
합니다. 따라서 when: stat_result.stat.exists
파일을 넣으면 when: stat_result.stat.exists == True
텍스트가 더 많고 불필요한 조건부 검사와 동일 하지만 파일이있는 경우 조건을 충족시킵니다 .
이것은 과도하게 보일 수 있지만 명령 모듈을 사용하지 않으려면 (명령을 사용하는 것이 dem 등성이 아니기 때문에) 복사 및 보관 취소의 조합을 사용할 수 있습니다.
나는 그것이 알고 년 오래된 주제, 그러나 나는 좌절하고 자신이 파일의 임의의 목록을 정확하게이 작업을 수행하는 역할을 내장되었다. 적합하다고 생각되면 확장하십시오.
main.yml
- name: created destination directory
file:
path: /path/to/directory
state: directory
mode: '0750'
- include_tasks: move.yml
loop:
- file1
- file2
- file3
move.yml
- name: stat the file
stat:
path: {{ item }}
register: my_file
- name: hard link the file into directory
file:
src: /original/path/to/{{ item }}
dest: /path/to/directory/{{ item }}
state: hard
when: my_file.stat.exists
- name: Delete the original file
file:
path: /original/path/to/{{ item }}
state: absent
when: my_file.stat.exists
하드 링크는 여기에서 복사하는 것이 좋습니다. 기본적으로 소유권과 사용 권한을 유지하므로 (파일의 두 번째 사본에 더 많은 디스크 공간을 사용하지 않음).