การปรับใช้โฟลเดอร์ของไฟล์เทมเพลตโดยใช้ ansible


47

มีวิธีง่าย ๆ ในการปรับใช้โฟลเดอร์ที่เต็มไปด้วยโฟลเดอร์. j2 ในกล่อง linux โดยใช้ชื่อเดียวกับแม่แบบ แต่ไม่มีนามสกุล. j2 แทนที่จะใช้โมดูลแม่แบบสำหรับแต่ละไฟล์?

ตอนนี้ฉันมีรายการยาว:

- 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
โน้ตwith_fileglobเสมอจากการดำเนินงานคุณจะได้รับเพื่อแม่ด้วยfiles/ stackoverflow.com/a/27407566/1695680../templates/mytemplate/*
ThorSummoner

2
ขอบคุณสิ่งนี้มีประโยชน์มาก ฉันพบว่าฉันต้องใช้แบ็กสแลชสองตัวเพื่อหลีกเลี่ยงช่วงเวลาที่แท้จริงในฟังก์ชัน regex_replace อาจเป็นเพราะฉันมีส่วนเทมเพลต dest ทั้งหมดภายในเครื่องหมายคำพูดคู่ดังนั้นฉันจึงสามารถใช้รูปแบบ YAML สำหรับคำจำกัดความงาน (ซึ่งฉันชอบมากกว่ารูปแบบหนึ่งซับ)
Tony Cesaro

1
สิ่งนี้จะถือว่ามีเพียงไฟล์ที่อยู่ในโฟลเดอร์แม่แบบเท่านั้นหากคุณต้องการสนับสนุนทั้งไดเรกทอรีและไฟล์ในโฟลเดอร์แม่แบบคุณจะต้อง with_filetree - ดูstackoverflow.com/questions/41667864/…
2560

บันทึกย่อที่regex_replaceควรตรงกับท้ายบรรทัด\.j2$สำหรับกรณีที่อาจมีรูปแบบอยู่ในชื่อไฟล์
Brett Ryan

20

Michael DeHaan (ผู้สร้าง Ansible) สร้างโพสต์บนCoderWallที่พูดถึงปัญหาที่คล้ายกันมาก คุณสามารถปรับและขยายตามความต้องการของคุณ (เช่นสิทธิ์และความเป็นเจ้าของ) ส่วนที่เกี่ยวข้องของการโพสต์อยู่ที่นี่:


สิ่งนี้สามารถทำให้ง่ายขึ้นโดยใช้ " with_items" และnotifyคำสั่งเดียว หากมีการเปลี่ยนแปลงงานบริการจะได้รับการแจ้งเตือนในลักษณะเดียวกับที่จำเป็นต้องรีสตาร์ทเมื่อสิ้นสุด 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

โปรดทราบว่าเนื่องจากเรามีงานที่รับอาร์กิวเมนต์ที่ไม่ซ้ำกันมากกว่าหนึ่งรายการเราไม่เพียง แต่พูดว่า " 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กลุ่มหรือไฟล์ YAML ที่โหลดจากvarsfilesคำสั่ง "" ภายใน playbook ดูสิว่ามันจะสะอาดแค่ไหนถ้าเราทำ

- 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
อีธา

ตอนนี้มันดูเหมือนผิดจริง บรรทัดแม่แบบที่ถูกต้องจะเป็นtemplate: src={{item.src}} dest={{item.dest}}(ไม่ใช่${var}แต่ค่อนข้าง{{var}})
Fabiano Francesconi

@FabianoFrancesconi อัปเดตแล้ว
Mxx

9

คำตอบโดย Russel ทำงานได้ แต่ต้องการการปรับปรุง

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

Firs ของ $ ทั้งหมดต้องไปตามที่มันเป็น regex ผิดใน regex_replace ประการที่สองไฟล์ทั้งหมดควรอยู่ในไดเรกทอรีไฟล์แทนที่จะเป็นไดเรกทอรีแม่แบบ


4
ยินดีต้อนรับสู่ Server Fault! คำตอบของคุณแนะนำวิธีแก้ปัญหาที่ใช้การได้กับคำถามผ่านทางคำตอบก่อนหน้าซึ่งจะเหมาะสมกว่าในการแก้ไขคำตอบนั้น โปรดพิจารณาลบคำตอบปัจจุบันของคุณและแนะนำการแก้ไขคำตอบของรัสเซล
Paul

7

ฉันเขียนปลั๊กอินการค้นหา filetree ที่สามารถช่วยดำเนินการกับแผนผังไฟล์

คุณสามารถเรียกคืนไฟล์ในแผนผังไฟล์และดำเนินการตามคุณสมบัติของไฟล์ (เช่นเทมเพลตหรือสำเนา) เนื่องจากเส้นทางสัมพัทธ์ถูกส่งคืนคุณสามารถสร้าง filetree บนระบบเป้าหมายได้อย่างง่ายดาย

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

มันทำให้ playbooks อ่านง่ายขึ้น


ยังไม่ได้รับการรวม :-(
มอร์แกนคริสเตียน

2
มันถูกรวมเข้าด้วยกัน
Dag Wieers

มีวิธีกรองเฉพาะไฟล์ * .conf หรือไม่
Andrey

แน่นอนว่าในส่วน "เมื่อ:" คุณสามารถเขียนนิพจน์ที่เหมาะกับความต้องการของคุณ
Dag Wieers

1
ปลั๊กอินไม่ช้ามันเป็นกระบวนการของการสร้างเทมเพลตและการคัดลอกแต่ละไฟล์ทีทำให้ช้า แต่นั่นแทบจะไม่เกี่ยวข้องกับปลั๊กอินเลยปลั๊กอินอาจมีประโยชน์สำหรับสิ่งอื่นนอกเหนือจากการสร้างเทมเพลตหรือการคัดลอก
Dag Wieers

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.