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


128

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

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

답변:


208

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

    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

1
디렉토리가 없으면 어떻게합니까?
ram4nd

2
디렉토리가 존재하지 않으면 레지스터 stat_resultstat_result.state.existsFalse가됩니다 (두 번째 작업이 실행될 때). docs.ansible.com/ansible/stat_module.html
Will

1
언제 : stat_result.stat.exists가 정의되고 stat_result.stat.exists
danday74

2
감사합니다. 발견하는 경우 또한, 당신은 쓸 수 있습니다 : when: stat_result.stat.exists == Falsewhen: not stat_result.stat.exists자연스러운 읽기를 원하는 경우.
racl101

1
"Foo == False"대신 "not Foo"를 사용 하시겠습니까?
Matthias Urlichs 19 년

32

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

- 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

최신 버전 에서처럼 "=", "<", ">"등 대신 "is"등의 "전체 텍스트 비교"를 사용할 때 경고가 표시됩니다.
Buzut

24

파일이있을 때 작업을 건너 뛰기 위해 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

16

일반적으로 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

1
state: file파일을 생성하지 않습니다. docs.ansible.com/ansible/file_module.html
Michael Krupp

2
이 답변의 첫 번째 예는 사용자 질문의 특정 상황, 사용자의 명령 모듈 사용 및 가능한 모범 사례를 기반으로이 질문에 대한 정답이라고 생각합니다.
apotek

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

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

2
당신은 당신의 대답을 설명하지 않습니다 when: mypath is not exists. 그리고이 경우 무슨 의미입니까? 아니다 mypath단순한 문자열은?
gcharbon

1
Jinja2 템플릿은 여기에서 경로를 확인하는 데 도움이됩니다. 더 많은 예제 Ansible 문서 도구
DreamUth

10
이것은 리모컨이 아닌 컨트롤러에서 파일을 확인합니다.
페페

2

이러한 .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) 압축을 풀어야하기 때문에 이것을 언급합니다.

도움이 되었기를 바랍니다


2

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

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

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

1
다른 사람들이이 답변을 이해하는 데 도움이되도록 귀하의 답변에 무엇이 문제
였으며이

1

Ansible stat 모듈을 사용 하여 파일을 등록하고 언제 모듈이 조건을 적용 할 수 있습니다.

- name: Register file
      stat:
        path: "/tmp/test_file"
      register: file_path

- name: Create file if it doesn't exists
      file: 
        path: "/tmp/test_file"
        state: touch
      when: file_path.stat.exists == False

0

**

When 조건을 사용하여 Ansible에 파일이 있는지 확인하는 방법

**

아래는 파일이 OS 끝에 존재할 때 파일을 제거하는 데 사용한 ansible play입니다.

 - name: find out /etc/init.d/splunk file exists or not'
      stat:
        path: /etc/init.d/splunk
      register: splunkresult
      tags:
        - always

    - name: 'Remove splunk from init.d file if splunk already running'
      file:
        path: /etc/init.d/splunk
        state: absent
      when: splunkresult.stat.exists == true
      ignore_errors: yes
      tags:
        - always

아래와 같이 플레이 조건을 사용했습니다.

when: splunkresult.stat.exists == true --> Remove the file

요구 사항에 따라 참 / 거짓을 줄 수 있습니다.

when: splunkresult.stat.exists == false
when: splunkresult.stat.exists == true

0

특정 파일이 존재하는지 확인하고 (예 : ansible을 통한 것과 다른 방식으로 생성되기 때문에) 그렇지 않은 경우 실패하면 다음과 같이 할 수 있습니다.

- name: sanity check that /some/path/file exists
  command: stat /some/path/file
  check_mode: no # always run
  changed_when: false # doesn't change anything

0

다른 답변을 보완하기위한 상대 경로에 대한 메모입니다.

코드로서의 인프라를 수행 할 때 저는 일반적으로 상대 경로, 특히 해당 역할에 정의 된 파일을 허용하는 역할과 작업을 사용합니다.

playbook_dir 및 role_path와 같은 특수 변수 는 존재 여부를 테스트하는 데 필요한 절대 경로를 만드는 데 매우 유용합니다.

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