[ansible] 원격 시스템에서 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


답변

버전 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 은 재귀 복사를 지원합니다.


답변

명령 모듈에서 작성 옵션이 유용하다는 것을 알았습니다. 이건 어때요:

- name: Move foo to bar
  command: creates="path/to/bar" mv /path/to/foo /path/to/bar

Bruce P가 제안한 것과 같은 통계를 사용하여 2 가지 작업 방식을 사용했습니다. 이제 나는 이것을 하나의 작업으로 만듭니다. 나는 이것이 훨씬 명확하다고 생각합니다.


답변

나에게 잘 맞는 다른 옵션은 동기화 모듈을 사용하는 것입니다 . 그런 다음 파일 모듈을 사용하여 원래 디렉토리를 제거하십시오.

다음은 문서의 예입니다.

- synchronize:
    src: /first/absolute/path
    dest: /second/absolute/path
    archive: yes
  delegate_to: "{{ inventory_hostname }}"


답변

이것을 달성하는 또 다른 방법은을 사용 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 파일이 있는지 확인합니다.