답변:
먼저 대상 파일이 있는지 여부를 확인한 다음 결과 출력에 따라 결정을 내릴 수 있습니다.
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_result
는 stat_result.state.exists
False가됩니다 (두 번째 작업이 실행될 때). docs.ansible.com/ansible/stat_module.html
when: stat_result.stat.exists == False
에 when: not stat_result.stat.exists
자연스러운 읽기를 원하는 경우.
파일이있을 때 작업을 건너 뛰기 위해 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
state: file
파일을 생성하지 않습니다. docs.ansible.com/ansible/file_module.html
vars:
mypath: "/etc/file.txt"
tasks:
- name: checking the file exists
command: touch file.txt
when: mypath is not exists
when: mypath is not exists
. 그리고이 경우 무슨 의미입니까? 아니다 mypath
단순한 문자열은?
이러한 .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
**
**
아래는 파일이 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
특정 파일이 존재하는지 확인하고 (예 : 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