Triển khai một thư mục các tệp mẫu bằng cách sử dụng ansible


47

Có một cách dễ dàng để triển khai một thư mục chứa đầy thư mục mẫu .j2 vào hộp linux, sử dụng cùng tên với mẫu, nhưng không có phần mở rộng .j2, thay vì sử dụng mô-đun mẫu cho mỗi tệp?

Ngay bây giờ tôi có một danh sách dài:

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

Câu trả lời:


67

Bạn có thể sử dụng with_fileglobđể lấy danh sách các tệp từ thư mục mẫu của mình và sử dụng các bộ lọc để loại bỏ phần mở rộng j2 như thế này ..

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

11
lưu ý with_fileglobluôn luôn hoạt động từ files/, bạn có thể nhận được mẫu với ../templates/mytemplate/*. stackoverflow.com/a/27407566/1695680
ThorSummoner

2
Cảm ơn, điều này là siêu hữu ích. Tôi thấy rằng tôi đã phải sử dụng hai dấu gạch chéo ngược để thoát khỏi khoảng thời gian theo nghĩa đen trong hàm regex numplace. Có lẽ vì tôi có toàn bộ phần mẫu mệnh trong dấu ngoặc kép nên tôi có thể sử dụng định dạng YAML cho định nghĩa tác vụ (mà tôi thích hơn định dạng một lớp).
Tony Cesaro

1
điều này giả sử chỉ các tệp nằm trong thư mục mẫu, nếu bạn cần hỗ trợ cả thư mục và tệp trong thư mục mẫu thì bạn cần with_filetree - xem stackoverflow.com/questions/41667864/
tựa

Một lưu ý regex_replacephải khớp ở cuối dòng \.j2$cho các trường hợp mẫu có thể tồn tại bên trong tên tệp.
Brett Ryan

20

Michael DeHaan (người tạo ra Ansible) đã đăng một bài trên CoderWall nói về vấn đề rất giống nhau. Bạn có thể điều chỉnh và mở rộng nó theo nhu cầu của bạn (chẳng hạn như quyền và quyền sở hữu). Phần có liên quan của bài viết ở đây:


Điều này có thể được đơn giản hóa bằng cách sử dụng " with_items" và một notifycâu lệnh. Nếu bất kỳ tác vụ nào thay đổi, dịch vụ sẽ được thông báo chính xác theo cùng một cách mà nó cần khởi động lại khi kết thúc quá trình phát playbook.

 - 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

Lưu ý rằng vì chúng tôi có các tác vụ có nhiều hơn một đối số duy nhất, chúng tôi không chỉ nói " item" trong dòng ' template:', mà sử dụng with_itemsvới biến băm (từ điển). Bạn cũng có thể giữ nó ngắn hơn một chút bằng cách sử dụng danh sách, nếu bạn muốn. Đây là một sở thích phong cách:

 - 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

Tất nhiên, chúng tôi cũng có thể xác định danh sách bạn đang xem trong một tệp khác, như groupvars/webserverstệp "" để xác định tất cả các biến cần thiết cho webserversnhóm hoặc tệp YAML được tải từ varsfileschỉ thị "" trong sổ chơi. Hãy nhìn cách này có thể dọn sạch nếu chúng ta làm.

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

5
Một phương pháp đơn giản hơn có thể là viết template: src=templates/{{item}}.j2 dest=/etc/splat/{{item}}.conf, và sau đó sử dụng một danh sách đơn giản các mục:with_items: - foo - bar
Ethan

Điều này thực sự có vẻ sai bây giờ. Dòng mẫu chính xác sẽ là template: src={{item.src}} dest={{item.dest}}(nghĩa là không ${var}nhưng đúng hơn {{var}})
Fabiano Francesconi

@FabianoFrancesconi cập nhật.
Mxx

9

Câu trả lời của Russel có tác dụng nhưng nó cần cải thiện

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

Linh hồn của tất cả các $ cần phải đi vì nó là regex sai trong regex numplace. Thứ hai, tất cả các tệp phải nằm trong thư mục tệp chứ không phải thư mục mẫu


4
Chào mừng bạn đến với Lỗi Máy chủ! Câu trả lời của bạn cho thấy một giải pháp khả thi cho câu hỏi có sẵn thông qua câu trả lời trước đó, do đó sẽ phù hợp hơn khi chỉnh sửa câu trả lời đó. Vui lòng xem xét xóa câu trả lời hiện tại của bạn và đề xuất chỉnh sửa câu trả lời của Russell.
Paul

7

Tôi đã viết một plugin tra cứu filetree có thể giúp thực hiện các hành động trên cây tập tin.

Bạn có thể lặp lại các tệp trong cây tệp và dựa trên các thuộc tính tệp thực hiện các hành động (ví dụ: mẫu hoặc bản sao). Vì đường dẫn tương đối được trả về, bạn có thể tạo lại filetree trên (các) hệ thống đích một cách dễ dàng.

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

Nó làm cho các playbooks dễ đọc hơn.


Nó chưa được hợp nhất :-(
Morgan Christiansson

2
Nó đã được sáp nhập.
Dag Wieers

Có cách nào để lọc chỉ nói các tệp * .conf không?
Andrey

Chắc chắn, trong phần "khi:" bạn có thể viết một biểu thức phù hợp với nhu cầu của bạn.
Dag Wieers

1
Plugin không chậm, đó là quá trình tạo khuôn mẫu và sao chép từng tệp riêng lẻ khiến nó chậm. Nhưng điều đó hầu như không liên quan gì đến plugin, plugin có thể hữu ích cho những thứ khác ngoài việc tạo khuôn mẫu hoặc sao chép.
Dag Wieers

3

Lệnh dưới đây làm việc cho tôi để thực hiện tra cứu đệ quy cho các tệp j2 trong các mẫu và di chuyển nó đến đích. Hy vọng nó sẽ giúp ai đó tìm kiếm bản sao đệ quy của mẫu đến đích.

     - 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

Có khả năng tự động lấy danh sách các tệp thực tế từ thư mục và lặp lại chúng sau đó ..

- 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() }}"

Lưu ý cảnh báo tiêu chuẩn về việc chia tách dòng mới - tên tệp có thể chứa dòng mới. Một giải pháp an toàn hơn là sử dụng tiện ích shell hỗ trợ print0, chẳng hạn như find, sau đó tách ra \u0000.
Dejay Clayton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.