Ansible로 빈 파일을 만드는 방법은 무엇입니까?


115

Ansible을 사용하여 빈 파일을 만드는 가장 쉬운 방법은 무엇입니까? 빈 파일을 files디렉토리에 저장 한 다음 원격 호스트에 복사 할 수 있다는 것을 알고 있지만 다소 만족스럽지 않습니다.

또 다른 방법은 원격 호스트의 파일을 터치하는 것입니다.

- name: create fake 'nologin' shell
  file: path=/etc/nologin state=touch owner=root group=sys mode=0555

그러나 파일은 매번 터치되어 로그에 노란색 선으로 표시되며 불만족 스럽습니다.

이 간단한 문제에 대한 더 나은 해결책이 있습니까?

답변:


189

파일 모듈의 문서에 따르면

인 경우 state=file파일이 존재하지 않으면 생성되지 않습니다. 해당 동작을 원하면 복사 또는 템플릿 모듈을 참조하십시오.

따라서 복사 모듈을 사용 force=no하여 파일이 아직 존재하지 않을 때만 새로운 빈 파일을 생성합니다 (파일이 존재하면 내용이 보존 됨).

- name: ensure file exists
  copy:
    content: ""
    dest: /etc/nologin
    force: no
    group: sys
    owner: root
    mode: 0555

이것은 선언적이고 우아한 솔루션입니다.


15
@ ÁkosVandra : 사실 그렇지 않습니다. 참조 : force: no.
palacsint

감사합니다-이것은 파일 / 터치 또는 허용 된 통계 / 파일 답변보다 훨씬 좋은 솔루션이며 "with_items"로 쉽게 수행 할 수 있습니다.
Realist

훌륭한 대답입니다. 제공 한 동일한 구성을 사용하여 두 개의 빈 파일을 어떻게 생성 할 수 있는지 궁금하십니까?
Tasdik Rahman 2017 년

존재하지 않는 경우 부모 디렉터리를 만드는 방법이 있습니까, 아니면 별도로해야합니까?
falsePockets 2019

상위 디렉토리가 존재하고 쓰기 가능한지 확인해야합니다. 참조 stackoverflow.com/questions/22844905/...
르네 Pijl

37

다음과 같이 작동합니다 ( stat먼저 모듈을 사용하여 데이터를 수집 한 다음 조건부로 필터링).

- stat: path=/etc/nologin
  register: p

- name: create fake 'nologin' shell
  file: path=/etc/nologin state=touch owner=root group=sys mode=0555
  when: p.stat.exists is defined and not p.stat.exists

또는 changed_when기능 을 활용할 수도 있습니다.


20
"언제 : p.stat.exists가 아님"
piro

28

명령 모듈을 사용하는 또 다른 옵션 :

- name: Create file
  command: touch /path/to/file
  args:
    creates: /path/to/file

'creates'인수는 파일이 존재하는 경우이 작업이 수행되지 않도록합니다.


5
명령은 멱 등성이 아니기 때문에 가능한 한 피해야합니다. ryaneschinger.com/blog/…
redshark1802

4
@ redshark1802 동의합니다. 이 경우 작업은 "/ path / to / file"이 이미 있으면 실행되지 않으므로 멱 등성입니다. 나는 르네 Pijl의 솔루션이 생각하는 세 개의 탑 답변을 더 좋아 - Ansible, 당신은 등 세트 소유권, 모드, 필요하면 확실히 한 당신은 사용해야합니다
Leynos

15

수락 된 답변을 기반으로 실행될 때마다 파일의 권한을 확인하고 파일이 존재하는 경우 이에 따라 변경되거나 파일이없는 경우 파일을 생성하려면 다음을 사용할 수 있습니다.

- stat: path=/etc/nologin
  register: p

- name: create fake 'nologin' shell
  file: path=/etc/nologin 
        owner=root
        group=sys
        mode=0555
        state={{ "file" if  p.stat.exists else "touch"}}

3
이 답변은 파일이 존재하지 않는 경우 파일의 파일 속성을 정의 할 때 유연성을 제공하기 때문에 훌륭합니다.
Dejay 클레이튼

10

file: path=/etc/nologin state=touch

터치와 완전히 동일 (1.4+에서 새로 추가됨)-파일 타임 스탬프를 변경하지 않으려면 stat를 사용하십시오.


3
멱 등성이 아니며, ansible 플레이 북을 실행할 때마다 파일 날짜가 수정됩니다.
Jérôme B

3
@ Jérôme B Ansible 2.7의 새로운 기능 : file: path=/etc/nologin state=touch modification_time=preserve access_time=preserve.
GregV

8

파일 모듈은 시간을 수정하지 않고 파일을 터치하는 방법을 제공합니다.

- name: Touch again the same file, but dont change times this makes the task idempotent
  file:
    path: /etc/foo.conf
    state: touch
    mode: u+rw,g-wx,o-rwx
    modification_time: preserve
    access_time: preserve

참조 : https://docs.ansible.com/ansible/latest/modules/file_module.html


이것은 ansible 2.7+에 대한 정답이지만 중요한 정보가 누락되었습니다.
Honza 2011

3

나는 이것을 주석으로 넣기에 충분한 평판을 가지고 있지 않다는 것이 밝혀졌습니다.

레. AllBlackt의 답변, Ansible의 여러 줄 형식을 선호하는 경우 인용문을 조정해야합니다 state(이 작업에 몇 분이 걸렸 으므로 다른 사람의 속도를 높일 수 있기를 바랍니다).

- stat:
    path: "/etc/nologin"
  register: p

- name: create fake 'nologin' shell
  file:
    path: "/etc/nologin"
    owner: root
    group: sys
    mode: 0555
    state: '{{ "file" if  p.stat.exists else "touch" }}'


0

파일이 없으면 변경됩니다. 빈 파일을 만듭니다.

- name: create fake 'nologin' shell
  file:
    path: /etc/nologin
    state: touch
  register: p
  changed_when: p.diff.before.state == "absent"

0

두 가지 답변의 조합, 반전. 코드는 파일이 생성되거나 권한이 업데이트 될 때 변경된 것으로 감지됩니다.

- name: Touch again the same file, but dont change times this makes the task idempotent
  file:
    path: /etc/foo.conf
    state: touch
    mode: 0644
    modification_time: preserve
    access_time: preserve
  changed_when: >
    p.diff.before.state == "absent" or
    p.diff.before.mode|default("0644") != "0644"

소유자 및 그룹도 수정하고 다음 수정시 변경된 것으로 감지하는 버전 :

- name: Touch again the same file, but dont change times this makes the task idempotent
  file:
    path: /etc/foo.conf
    state: touch
    state: touch
    mode: 0644
    owner: root
    group: root
    modification_time: preserve
    access_time: preserve
  register: p
  changed_when: >
    p.diff.before.state == "absent" or
    p.diff.before.mode|default("0644") != "0644" or
    p.diff.before.owner|default(0) != 0 or
    p.diff.before.group|default(0) != 0

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