[ansible] Ansible에 파일이 있는지 확인하는 방법은 무엇입니까?

에 파일이 있는지 확인해야합니다 /etc/. 파일이 있으면 작업을 건너 뛰어야합니다. 내가 사용하는 코드는 다음과 같습니다.

- name: checking the file exists
  command: touch file.txt
  when: $(! -s /etc/file.txt)



답변

먼저 대상 파일이 있는지 여부를 확인한 다음 결과 출력에 따라 결정을 내릴 수 있습니다.

    tasks:
      - name: Check that the somefile.conf exists
        stat:
          path: /etc/file.txt
        register: stat_result

      - name: Create the file, if it doesnt exist already
        file:
          path: /etc/file.txt
          state: touch
        when: not stat_result.stat.exists


답변

합계 모듈은 파일에 대한 다른 정보를 많이 얻을뿐만 아니라이 작업을 수행 할 것입니다. 예제 문서에서 :

- stat: path=/path/to/something
  register: p

- debug: msg="Path exists and is a directory"
  when: p.stat.isdir is defined and p.stat.isdir


답변

파일이있을 때 작업을 건너 뛰기 위해 stat 모듈을 사용하면됩니다.

- hosts: servers
  tasks:
  - name: Ansible check file exists.
    stat:
      path: /etc/issue
    register: p
  - debug:
      msg: "File exists..."
    when: p.stat.exists
  - debug:
      msg: "File not found"
    when: p.stat.exists == False


답변

일반적으로 stat 모듈을 사용 하여이 작업을 수행 합니다 . 그러나 명령 모듈 에는 creates이를 매우 간단하게 만드는 옵션이 있습니다.

- name: touch file
  command: touch /etc/file.txt
  args:
    creates: /etc/file.txt

나는 당신의 터치 명령이 단지 예라고 생각합니까? 모범 사례는 아무것도 확인하지 않고 올바른 모듈을 사용하여 ansible이 작업을 수행하도록하는 것입니다. 따라서 파일이 존재하는지 확인하려면 파일 모듈을 사용합니다.

- name: make sure file exists
  file:
    path: /etc/file.txt
    state: touch


답변

vars:
  mypath: "/etc/file.txt"

tasks:
  - name: checking the file exists
    command: touch file.txt
    when: mypath is not exists


답변

이러한 .stat.exists유형 검사를 많이 수행하는 것이 성 가시고 오류가 발생하기 쉽습니다 . 예를 들어 검사 모드 ( --check)가 작동 하려면 각별한주의가 필요합니다 .

여기에 많은 답변이 제안됩니다.

  • 입수 및 등록
  • 레지스터 표현식이 참일 때 적용

그러나 때때로 이것은 코드 냄새이므로 항상 Ansible을 사용하는 더 나은 방법을 찾으십시오. 특히 올바른 모듈을 사용하면 많은 이점이 있습니다. 예 :

- name: install ntpdate
  package:
    name: ntpdate

또는

- file:
    path: /etc/file.txt
    owner: root
    group: root
    mode: 0644

단, 하나의 모듈을 사용할 수없는 경우에는 이전 작업의 결과를 등록하고 확인할 수 있는지도 조사하십시오. 예 :

# jmeter_version: 4.0
- name: Download Jmeter archive
  get_url:
    url: "http://archive.apache.org/dist/jmeter/binaries/apache-jmeter-{{ jmeter_version }}.tgz"
    dest: "/opt/jmeter/apache-jmeter-{{ jmeter_version }}.tgz"
    checksum: sha512:eee7d68bd1f7e7b269fabaf8f09821697165518b112a979a25c5f128c4de8ca6ad12d3b20cd9380a2b53ca52762b4c4979e564a8c2ff37196692fbd217f1e343
  register: download_result

- name: Extract apache-jmeter
  unarchive:
    src: "/opt/jmeter/apache-jmeter-{{ jmeter_version }}.tgz"
    dest: "/opt/jmeter/"
    remote_src: yes
    creates: "/opt/jmeter/apache-jmeter-{{ jmeter_version }}"
  when: download_result.state == 'file'

메모 when:뿐만 아니라 creates:지금은 --check밖으로 오류가 없습니다

나는 종종 이러한 이상적이지 않은 관행이 쌍으로 나옵니다. 즉 apt / yum 패키지가 없으므로 1) 다운로드하고 2) 압축을 풀어야하기 때문에 이것을 언급합니다.

도움이 되었기를 바랍니다


답변

호출 stat이 느리고 파일 존재 확인에 필요하지 않은 많은 정보를 수집 함을 발견했습니다 .
솔루션을 검색하는 데 시간을 보낸 후 훨씬 빠르게 작동하는 다음 솔루션을 발견했습니다.

- raw: test -e /path/to/something && echo true || echo false
  register: file_exists

- debug: msg="Path exists"
  when: file_exists == true