원격 시스템에서 Ansible 작업을 사용하여 파일을 이동하거나 이름을 바꾸는 방법


202

원격 시스템에서 Ansible 모듈을 사용하여 파일 / 디렉토리를 어떻게 이동 / 이름 바꾸기 할 수 있습니까? 명령 / 쉘 작업을 사용하고 싶지 않으며 로컬 시스템에서 원격 시스템으로 파일을 복사하고 싶지 않습니다.


커맨드 / 쉘을 사용하고 싶지 않은 이유는 무엇입니까?
Nick Urban

4
언급 된 작업을 사용하지 않고 방법이 있는지 알고 싶었습니다. 현재 다른 방법이없는 것 같습니다.
Christian Berendt

1
왜 복사하지 않고 구체적으로 옮기고 싶습니까? 이는 시스템 상태의 단계 유형을 dem 등식이 아니라 일회성 조치처럼 보입니다.
Nick Urban

2
RPM 패키지에 샘플 구성 파일이 포함되어 있으며이 샘플 구성 파일을 이동하려고합니다.
Christian Berendt 2016 년

1
현재 파일을 참조하기 위해 symlink를 사용하고 있습니다. 시스템이 인터넷에 접근 할 수 없기 때문에 get_url을 사용하는 것은 나에게 옵션이 아닙니다.
기독교 베렌트

답변:


201

파일 모듈은 원격 시스템의 파일을 복사하지 않습니다. 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

3
명령 모듈을 사용하지 않으면 다른 선택 방법은 사용자 정의 모듈을 작성하는 것입니다.
Bruce P

2
현재 원격 파일을 복사하는 방법이므로 정답으로 태그되었습니다.
Christian Berendt

11
당신이 도약하기 전에보고와 관련하여 다음 사용하지 어떤 이유가 removes받는 옵션 command모듈 (문서화 된 여기이 )? 이 옵션은 Ansible을 먼저 확인하는 것으로 보입니다.
Jim Witschey

2
Ansible은 핸들러에 알리기 위해 변경 사항을 추적하여이 솔루션을 최적의 상태로 만듭니다.
boh

3
당신은 당신이 사용하는 경우 수동으로 파일의 존재를 확인하지 않아도 removes: /path/to/foocreates: /path/to/bar. @Fonant는 이미 이것을 다른 답변에 대한 의견으로 언급했지만 이것이 허용되는 답변이므로 다시 지적하고 싶습니다.
Michael Trojanek

218

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


29
작은 말 : "현재 remote_src는 재귀 복사를 지원하지 않습니다." ansible 모듈 문서에서 가져옵니다. 따라서 재귀 적으로 복사하려면 여전히 셸 / 명령 모듈이 필요합니다.
klaas

23
이해가 안 돼요 복사 한 후 삭제하는 것은 이동하는 것과 다릅니다. 하나는 원자가 아닙니다. 다른 경우에는 특히 큰 파일의 경우 속도가 느립니다. 나는 Ansible을 처음 사용하지만, 나에게는 정말 이상해 보인다.
mlissner

19
@alex 내가 말하고있는 것은 이것을하는 올바른 방법이 될 수 없다는 것입니다. 나는 50 가지의 공감대에 맞서고 있지만, 이것은 미쳤다. 또 다른 문제 : 권한 및 기타 속성이 유지되지 않습니다. 다른 : 복사 중에 파일 이 변경 되면 어떻게 됩니까?
mlissner

2
@ 해미 쉬 다우 너와 mlissner. 모든 요구에 가장 적합한 솔루션이라고 말하지 않았습니다. 또한 많은 파일을 복사하려면 복사 모듈을 사용하지 않아야한다고 썼습니다. "명령 / 쉘 작업을 사용하고 싶지 않습니다"라는 질문을 읽으십시오.
Alex

7
@Alex 이것은 파일을 dem 등하 게 움직이는 것에 관한 질문에 대해 두 번째로 높은 투표 답변입니다. 문제는 복사에 관한 것이 아닙니다. 이동 대신 복사에 많은 문제가 있으므로이 대답은 틀립니다. 따라서 공감대를 얻습니다. 에티켓은 다운 보트를 설명하는 것입니다. 다른 곳에서 언급 한 바와 같이, 최선의 선택은 지금까지이다command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
알렉 Wenzowski

106

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

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

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


60
또는 더 나은 : command: mv /path/to/foo /path/to/bar creates=/path/to/bar removes=/path/to/foo
Fonant

8

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

다음은 문서의 예입니다.

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

dest디렉토리가 동일한 시스템에 있더라도 SSH를 통해 액세스 되므로 모든 경우에 로컬로 작동하지 않습니다 .
Karl Richter

5

이것을 달성하는 또 다른 방법은을 사용 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).


2
불행히도 디렉토리에는 하드 링크가 허용되지 않기 때문에 디렉토리에서는 작동하지 않습니다 ((
Drew

1
이 답변은 대상 시스템, 특히 src와 dest가 동일한 파티션에 있다고 가정합니다. 이것은 사실이 아니므로이 답변을 사용해서는 안됩니다.
mikky

4

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

3

이것이 나를 위해 일한 방식입니다.

  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 파일이 있는지 확인합니다.


3
사용할 필요가 없습니다 when: stat_result.stat.exists == True. 사용하는 것만으로도 when: stat_result.stat.exists충분합니다.
kuttumiah

나는 == True파일을 찾을 수 없을 때 항상 무언가를하고 있기 때문에 보통을 사용합니다 == False.
eduprado 15:53에

모듈 속성 의 공식 문서 페이지에stat 따르면 값을 exists반환 boolean합니다. 따라서 when: stat_result.stat.exists파일을 넣으면 when: stat_result.stat.exists == True텍스트가 더 많고 불필요한 조건부 검사와 동일 하지만 파일이있는 경우 조건을 충족시킵니다 .
kuttumiah '

0

이것은 과도하게 보일 수 있지만 명령 모듈을 사용하지 않으려면 (명령을 사용하는 것이 dem 등성이 아니기 때문에) 복사 및 보관 취소의 조합을 사용할 수 있습니다.

  1. tar를 사용하여 필요한 파일을 보관하십시오. 미리 생각하면 실제로 의미가 있습니다. 주어진 디렉토리에 일련의 파일이 필요할 수 있습니다. 모든 파일로 해당 디렉토리를 작성하고 tar로 아카이브하십시오.
  2. 보관 취소 모듈을 사용하십시오. 이를 수행 할 때 destination : 및 remote_src : 키워드와 함께 모든 파일을 임시 폴더에 복사하여 시작한 다음 원하는 위치에 정확하게 압축을 풀 수 있습니다.

tar로 아카이브 할 때 i 등성이 없습니다
visit1985

0

당신은 그것을 할 수 있습니다-

Ad Hoc 명령 사용

ansible all -m command -a" mv /path/to/foo /path/to/bar"

또는 플레이 북을 사용하여 원하는 경우

- name: Move File foo to destination bar
  command: mv /path/to/foo /path/to/bar

0

나는 그것이 알고 오래된 주제, 그러나 나는 좌절하고 자신이 파일의 임의의 목록을 정확하게이 작업을 수행하는 역할을 내장되었다. 적합하다고 생각되면 확장하십시오.

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

하드 링크는 여기에서 복사하는 것이 좋습니다. 기본적으로 소유권과 사용 권한을 유지하므로 (파일의 두 번째 사본에 더 많은 디스크 공간을 사용하지 않음).


0

Windows에서 : - name: Move old folder to backup win_command: "cmd.exe /c move /Y {{ sourcePath }} {{ destinationFolderPath }}"

이름을 바꾸려면 대신 rename 또는 ren 명령을 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.