ansible에서 존재하지 않는 디렉토리를 자동으로 생성하는 쉬운 방법은 무엇입니까?


117

내 Ansible 플레이 북에서 여러 번 거기에 파일을 만들어야합니다.

 - name: Copy file
   template:
     src: code.conf.j2
     dest: "{{project_root}}/conf/code.conf"

이제 여러 번 confdir이 없습니다. 그런 다음 먼저 해당 디렉토리를 만들기 위해 더 많은 작업을 만들어야합니다.

어떤 옵션과 함께 존재하지 않는 경우 디렉토리를 자동 생성하는 쉬운 방법이 있습니까?



이것이 ansible 2.9에서 여전히 문제라고 믿을 수 없습니다. 이 모듈이 기본적으로 off로 설정된 create dir 토글을 갖는 것이 얼마나 어려울까요? 아래 답변과 같은 사전 테스트를 처리해야하므로 플레이 북에 많은 부담을 줄 수 있습니다
krad

답변:


139

지금이게 유일한 방법

- name: Ensures {{project_root}}/conf dir exists
  file: path={{project_root}}/conf state=directory
- name: Copy file
  template:
    src: code.conf.j2
    dest: "{{project_root}}/conf/code.conf"

2
여기에 확실한 단어가 있다고 생각합니다. 확신하십시오 : "의심을 없애기 위해 누군가에게 긍정적으로 말하십시오", "(뭔가) 발생하거나 사건이 될 것인지 확인하십시오".
Daniel Compton

그것은 감독이 존재하는지 확인하는 것처럼 보이지만 그것을 생성하지 않는 것 같습니다.
매트

8
추가 할 수 있음을 유의 recurse=yes받는 file얻기 위해 호출 mkdir -p유형의 행동을
미치

1
도움이 될 수있는 또 다른 퍼즐 조각은 파일이 포함 된 디렉토리를 가져 오는 ansible 특정 dirname필터 입니다.
캐스퍼

1
@radtek 파일 모듈은 이미 state = directory로 수행합니다. 제안 된 파일 경로가 디렉터리를 가리키는 지 확인할 수 없으면 실패합니다.
Alexander Jardim 2017

21

전체 경로로 성공하려면 recurse = yes를 사용하십시오.

- name: ensure custom facts directory exists
    file: >
      path=/etc/ansible/facts.d
      recurse=yes
      state=directory

2
문서 (및 내 테스트)에 따르면 하위 디렉터리는 항상 생성되고 recurse=yes권한을 재귀 적으로 만 적용합니다. 그러나 문서에는 v1.7부터 자동으로 발생하므로 recurse더 이상 사용되지 않을 수 있습니다.
로 마 SE

16

Ansible> = 2.0을 실행 하는 경우 경로의 디렉토리 부분을 추출하는 데 사용할 수 있는 dirname 필터도 있습니다. 이렇게하면 하나의 변수를 사용하여 전체 경로를 유지하여 두 작업이 동기화되지 않도록 할 수 있습니다.

예를 들어 다음 dest_path과 같은 변수에 정의 된 플레이 북 이있는 경우 동일한 변수를 재사용 할 수 있습니다.

- name: My playbook
  vars:
    dest_path: /home/ubuntu/some_dir/some_file.txt
  tasks:

    - name: Make sure destination dir exists
      file:
        path: "{{ dest_path | dirname }}"
        state: directory
        recurse: yes

    # now this task is always save to run no matter how dest_path get's changed arround
    - name: Add file or template to remote instance
      template: 
        src: foo.txt.j2
        dest: "{{ dest_path }}"

1
이 솔루션은 여전히 ​​장황하지만 저자의 의도에 가장 가깝다고 생각합니다. 내가 할 사랑 간단한이 있다면 그것을 소금 같은 'makedirs'매개 변수가 있습니다 docs.saltstack.com/en/latest/ref/states/all/...
LSH

7

AFAIK,이 작업을 수행 할 수 있는 유일한 방법 은 state=directory옵션 을 사용하는 것입니다. template모듈은 대부분의 copy옵션을 지원하고 차례로 대부분의 옵션을 지원 하지만 file이와 같은 것을 사용할 수는 없습니다 state=directory. 더욱이, 그것은 상당히 혼란 스러울 것입니다 ( {{project_root}}/conf/code.conf디렉토리라는 것을 의미할까요? 아니면 그것이 {{project_root}}/conf/먼저 생성되어야 한다는 것을 의미할까요?) .

그래서 지금은 이전 file작업 을 추가하지 않고는 이것이 가능하지 않다고 생각합니다 .

- file: 
    path: "{{project_root}}/conf"
    state: directory
    recurse: yes

7

최신 문서에 따르면 상태가 디렉토리로 설정되면 부모 디렉토리를 생성 하기 위해 매개 변수 recurse 를 사용할 필요가 없으며 파일 모듈이 처리합니다.

- name: create directory with parent directories
  file:
    path: /data/test/foo
    state: directory

이 상위 디렉토리에 만들 수있는 요리 충분한 데이터테스트foo는

매개 변수 설명을 참조하십시오- " state " http://docs.ansible.com/ansible/latest/modules/file_module.html


나중에 끊어 질 수있는 링크 대신 여기에 솔루션을 추가하십시오.
Ignacio Ara

@IgnacioAra 귀중한 의견에 감사드립니다, 해결책을 추가했습니다.
Alby


1

복사 모듈은 디렉토리가 없으면 생성합니다. 이 경우 resolved.conf.d 디렉토리를 생성했습니다.

- name: put fallback_dns.conf in place                                                                 
  copy:                                                                                                
    src: fallback_dns.conf                                                                             
    dest: /etc/systemd/resolved.conf.d/                                                                
    mode: '0644'                                                                                       
    owner: root                                                                                        
    group: root                                                                                        
  become: true                                                                                         
  tags: testing
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.