ansible에 대한 이미지 검색결과



ansible 로 파일을 삭제 할때 다음과 같은 case에 직면한다.


1. 특정 파일이나 디렉터리를 삭제

2. 디렉터리의 모든 파일을 삭제

3. 정규식을 사용하여 파일을 삭제


특히 디렉터리 내 모든 파일을 삭제하거나, 특정 패턴의 파일 이름을 삭제할경우

shell or command 모듈을 사용하여 "rm -rf /tmp/path/rain*" 등의 wildcard 를 사용할텐데..


멱등성이 유지되지 않음으로, 파일 모듈을 사용하는것이 좋다.



  • 파일 삭제

Ansible 파일 모듈을 사용하여 특정 파일을 안전하게 삭제한다.

파일 모듈은 state, absent 를 사용하여 대상 파일을 제거한다. 

또한, 심볼릭 링크나 디렉터리를 삭제할때도 사용 가능하다.


다음 예제에서는 test.log 파일을 제거한다. 파일이 없는경우 ok 로 아무런 처리하지 않는다.


 - name : delete file

   file:

     path: /tmp/test.log

     state: absent


  • 여러 파일 삭제

with_items 를 사용하여 여러 파일을 삭제 할 수 있다.

 - name : multiple delete file

   file:

     path: {{ item }}

     state: absent

   with_items:

     - test1.log

     - test2.log

     - test3.log



  • File glob 을 사용하여 파일 삭제

특정 패턴의 파일을 삭제 해야할 수 있습니다. Wildcard 는 이럴때 유용하긴하지만, 파일 모듈은

Wildcard 를 지원하지 않습니다.

이때 보통 command or shell 모듈에서 rm -rf 를 사용하는데, 파일이 있든 없든 오류를 던지지 않는다.


- name : wildcard file delete

  shell: rm -rf test*.log 


여기서 더 좋은 방법은 wildcard 가 해당되는 파일을 찾아서 각각 삭제 하는것이다.


다음 예제에서는 find 모듈을 사용하여 확장자가 .log 인 파일을 찾는다.

정규 표현식은 python 정규 표현익을 사용 할 수 있고, use_regex 매개변수를 true 로 설정하면 된다.


find 모듈은 패턴과 일치하는 모든 파일을 리턴하고 레지스터에 저장한다.


다음 작업에서는 'files_find' 레지스터를 사용하여 파일을 각각 하나씩 삭제한다.


 - hosts: all

   tasks:

   - name: delete file wildcard

     find:

      paths: /etc/wild_card/example

      patterns: "^te.*.log"

      use:regex: true

     register: files_find


   - name: Ansible remove file wildcard

     file:

      path: "{{ item.path }}"

      state: absent

     with_items: "{{ files_find.files }}"

 




Posted by pysany
,