Ansible을 사용하여 템플릿 파일 폴더 배포


47

템플릿과 동일한 이름을 사용하지만 각 파일에 대해 템플릿 모듈을 사용하는 대신 .j2 확장명을 사용하지 않고 템플릿 .j2 폴더로 가득 찬 폴더를 Linux 상자에 배포하는 쉬운 방법이 있습니까?

지금은 긴 목록이 있습니다.

- name: create x template
  template:
    src=files/x.conf.j2
    dest=/tmp/x.conf
    owner=root
    group=root
    mode=0755
  notify:
    - restart myService

답변:


67

당신이 사용할 수있는 with_fileglob템플릿 디렉토리에서 파일의 목록을 얻을이 같은 J2 확장을 제거하기 위해 필터를 사용하는 ..

- name: create x template
  template:
    src: {{ item }}
    dest: /tmp/{{ item | basename | regex_replace('\.j2','') }}
  with_fileglob:
    - ../templates/*.j2

11
note는 with_fileglob항상에서 작동하며을 사용 files/하여 템플릿을 얻을 수 있습니다 ../templates/mytemplate/*. stackoverflow.com/a/27407566/1695680
ThorSummoner

2
고마워, 이것은 매우 도움이됩니다. regex_replace 함수에서 리터럴 기간을 벗어나려면 두 개의 백 슬래시를 사용해야한다는 것을 알았습니다. 어쩌면 전체 따옴표 템플릿 부분을 큰 따옴표로 묶었으므로 작업 정의에 YAML 형식을 사용할 수 있기 때문에 (한 줄짜리 형식보다 선호합니다).
Tony Cesaro

1
참조 -이 당신이 with_filetree 필요 다음 템플릿 폴더 내에서 두 디렉토리 및 파일을 지원해야하는 경우에만 파일, 템플릿 폴더 내에 살고있는 가정 stackoverflow.com/questions/41667864/...
danday74

파일 이름 내에 패턴이 존재할 수있는 경우 regex_replace줄 끝에서 일치해야하는 메모입니다 \.j2$.
Brett Ryan

20

Ansible의 제작자 인 Michael DeHaan은 CoderWall 에 매우 비슷한 문제에 대해 글을 올렸 습니다 . 필요에 따라 (예 : 권한 및 소유권) 조정하고 확장 할 수 있습니다. 게시물의 관련 부분은 다음과 같습니다.


" with_items"및 단일 notify명령문 을 사용하여 단순화 할 수 있습니다 . 작업이 변경되면 플레이 북 실행이 끝날 때 서비스를 다시 시작해야하는 것과 동일한 방식으로 서비스에 알림이 전송됩니다.

 - name:  template everything for fooserv
   template: src={{item.src}} dest={{item.dest}}
   with_items:
      - { src: 'templates/foo.j2', dest: '/etc/splat/foo.conf' }
      - { src: 'templates/bar.j2', dest: '/etc/splat/bar.conf' }
   notify: 
      - restart fooserv

둘 이상의 고유 한 인수를 취하는 작업이 item있으므로 ' template:'행 에 " " 라고 말하지 않고 with_items해시 (사전) 변수와 함께 사용 하십시오. 원하는 경우 목록을 사용하여 조금 더 짧게 유지할 수도 있습니다. 이것은 스타일 선호도입니다.

 - name:  template everything for fooserv
   template: src={{item.0}} dest={{item.1}}
   with_items:
      - [ 'templates/foo.j2', '/etc/splat/foo.conf' ]
      - [ 'templates/bar.j2', '/etc/splat/bar.conf' ]
   notify: 
      - restart fooserv

물론 그룹에 groupvars/webservers필요한 모든 변수를 정의하기 위한 " "파일 webservers또는 varsfiles플레이 북 내의 " "지시문 에서로드 된 YAML 파일 과 같이 다른 파일로 이동 한 목록을 정의 할 수도 있습니다 . 그렇게하면 어떻게 정리할 수 있는지보십시오.

- name: template everything for fooserv
  template: src={{item.src}} dest={{item.dest}}
  with_items: {{fooserv_template_files}}
  notify: 
      - restart fooserv

5
보다 간단한 방법은을 작성 template: src=templates/{{item}}.j2 dest=/etc/splat/{{item}}.conf하고 일반 항목 목록을 사용하는 것입니다.with_items: - foo - bar
Ethan

이것은 실제로 잘못 보입니다. 올바른 템플릿 줄 것 template: src={{item.src}} dest={{item.dest}}(즉,하지 ${var}아니라 {{var}})
파비아누 Francesconi

@FabianoFrancesconi가 업데이트되었습니다.
Mxx

9

Russel의 답변은 효과가 있지만 개선이 필요합니다.

- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
   - files/*.j2

모든 $의 전나무는 regex_replace의 잘못된 정규 표현식이므로 가야합니다. 두 번째로 모든 파일은 템플릿 디렉토리가 아닌 파일 디렉토리에 있어야합니다.


4
서버 결함에 오신 것을 환영합니다! 귀하의 답변에 따르면 이전 답변을 통해 문제에 대한 해결책을 찾을 수 있으므로 해당 답변을 수정하는 것이 더 적합합니다. 현재 답변을 삭제하고 Russell의 답변에 대한 수정 제안을 고려하십시오.
Paul

7

파일 트리 작업에 도움이되는 파일 트리 조회 플러그인을 작성했습니다.

파일 트리에서 파일을 재귀하고 파일 속성을 기반으로 작업 (예 : 템플릿 또는 복사)을 수행합니다. 상대 경로가 반환되므로 대상 시스템에서 파일 트리를 쉽게 다시 만들 수 있습니다.

- name: Template complete tree
  template:
    src: '{{ item.src }}'
    dest: /web/{{ item.path }}
    force: yes
  with_filetree: some/path/
  when: item.state == 'file'

더 읽기 쉬운 플레이 북을 만듭니다.


그것은 아직 합병되지 않았다 :-(
Morgan Christiansson

2
병합되었습니다.
Dag Wieers

* .conf 파일 만 필터링하는 방법이 있습니까?
안드레이

물론, "언제"부분에서 필요에 맞는 표현을 작성할 수 있습니다.
Dag Wieers

1
플러그인은 느리지 않습니다. 각 파일을 개별적으로 템플릿 화하고 복사하여 느리게 만드는 프로세스입니다. 그러나 그것은 플러그인과 관련이 거의 없으며 플러그인은 템플릿이나 복사 이외의 다른 용도에 유용 할 수 있습니다.
Dag Wieers 2016 년

3

아래 명령은 템플릿에서 j2 파일에 대한 재귀 적 조회를 수행하고 대상으로 옮겼습니다. 누군가 대상으로 템플릿의 재귀 복사본을 찾는 데 도움이되기를 바랍니다.

     - name: Copying the templated jinja2 files
       template: src={{item}} dest={{RUN_TIME}}/{{ item | regex_replace(role_path+'/templates','') | regex_replace('\.j2', '') }}
       with_items: "{{ lookup('pipe','find {{role_path}}/templates -type f').split('\n') }}"

1

디렉토리에서 실제 파일 목록을 자동으로 가져 와서 나중에 반복 할 수 있습니다.

- name:         get the list of templates to transfer
  local_action: "shell ls templates/* | sed 's~.*/~~g'"
  register:     template_files

- name:         iterate and send templates
  template:     src=templates/{{ item }} dest=/mydestination/{{ item }}
  with_items:
  - "{{ template_files.stdout.splitlines() }}"

줄 바꿈에서 분리에 대한 표준주의 사항에 유의하십시오-파일 이름에는 줄 바꿈이 포함될 수 있습니다. 더 안전한 솔루션을 지원하는 쉘 유틸리티를 사용하는 것 print0등을, find다음에 분할 \u0000.
Dejay Clayton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.