Score:3

วนซ้ำผ่านรายการ / พจนานุกรมที่ซ้อนกันโดยใช้เทมเพลต Jinja2

ธง ph

ฉันกำลังพยายามกำหนดค่าเซิร์ฟเวอร์ NFS หลายตัวในระบบของฉันแบบไดนามิกโดยสร้างไฟล์ /etc/exports โดยใช้ Ansible ฉันหวังว่าจะทำได้ด้วยเทมเพลต jinja2 เป็นเทมเพลต jinja2 ที่ฉันไม่สามารถหาได้จากรายการส่งออกของฉัน

ฉันมีตัวแปรต่อไปนี้ที่กำหนดไว้ในบทบาท nfs ของฉัน:

site_nfs_servers: ['ansibletarget1', 'ansibletarget2']

ส่งออก:
  - เซิร์ฟเวอร์: "ansibletarget1"
    หุ้น:
      - เส้นทาง: "/ของฉัน/ครั้งแรก/แบ่งปัน/เส้นทาง"
        ลูกค้า: "*"
        ตัวเลือก: "rw,ซิงค์"
      - เส้นทาง: "/ของฉัน/วินาที/แชร์/เส้นทาง"
        ลูกค้า: "*"
        ตัวเลือก: "rw,ซิงค์,root_squash"
  - เซิร์ฟเวอร์: "ansibletarget2"
    หุ้น:
      - เส้นทาง: "/อีก/แชร์/เส้นทาง/แตกต่าง/เซิร์ฟเวอร์"
        ลูกค้า: "*"
        ตัวเลือก: "ro,ซิงค์"

ฉันมีการเล่น ansible ต่อไปนี้เพื่อสร้างเทมเพลต:

- ชื่อ: สร้างไฟล์ส่งออก
  แม่แบบ:
    src: exports.j2
    ปลายทาง: /etc/exports
    เจ้าของ: ราก
    กลุ่ม: ราก
    โหมด: '0750'

ขณะนี้เทมเพลตของฉันมีลักษณะดังนี้:

{% สำหรับการส่งออกในการส่งออก %}
{% ถ้า ansible_hostname ใน export.server %}
{% สำหรับส่วนแบ่งในหุ้น %}
{{ share.path }} {{ share.client }} {{ share.options }}
{% สิ้นสุดสำหรับ %}
{% เอนดิฟ %}
{% สิ้นสุดสำหรับ %}

ฉันไม่คิดว่าฉันเกือบจะใกล้เคียงกับการมีโครงสร้างเทมเพลตที่ถูกต้อง มีใครทำซ้ำในรายการนี้บนโลกนี้อย่างไร

Score:3
ธง in

คุณไม่มีการอ้างอิงถึง ส่งออก ในลูปที่สองของคุณ

{% สำหรับการส่งออกในการส่งออก %}
{% ถ้า ansible_hostname ใน export.server %}
{% สำหรับส่วนแบ่งในการส่งออกหุ้น %}
{{ share.path }} {{ share.client }} {{ share.options }}
{% สิ้นสุดสำหรับ %}
{% เอนดิฟ %}
{% สิ้นสุดสำหรับ %}

อย่างไรก็ตาม จะเป็นการดีกว่าหากกำหนดส่วนแบ่งในตัวแปรโฮสต์ดังที่แสดงในคำตอบโดย Vladimir

Score:2
ธง br

สร้างสินค้าคงคลัง

เปลือก> เจ้าภาพแมว
[ไซต์_nfs_เซิร์ฟเวอร์]
ansibletarget1
ansibletarget2

และใส่ หุ้น เข้าไปใน host_vars

เปลือก> cat host_vars/ansibletarget1.yml 
หุ้น:
  - เส้นทาง: "/ของฉัน/ครั้งแรก/แบ่งปัน/เส้นทาง"
    ลูกค้า: "*"
    ตัวเลือก: "rw,ซิงค์"
  - เส้นทาง: "/ของฉัน/วินาที/แชร์/เส้นทาง"
    ลูกค้า: "*"
    ตัวเลือก: "rw,ซิงค์,root_squash"
เชลล์> cat host_vars/ansibletarget2.yml 
หุ้น:
  - เส้นทาง: "/อีก/แชร์/เส้นทาง/แตกต่าง/เซิร์ฟเวอร์"
    ลูกค้า: "*"
    ตัวเลือก: "ro,ซิงค์"

สร้างบทบาทที่เรียบง่ายสำหรับการทดสอบ

เปลือก> บทบาทของต้นไม้/my_nfs_role/
บทบาท/my_nfs_role/
âââ งาน
â âââ main.yml
เทมเพลต âââ
    âââ exports.j2

2 ไดเร็กทอรี 2 ไฟล์
เชลล์> บทบาทของแมว/my_nfs_role/tasks/main.yml 
- แม่แบบ:
    src: exports.j2
    ปลายทาง: /etc/exports.test
เชลล์> บทบาทของแมว/my_nfs_role/templates/exports.j2 
{% สำหรับส่วนแบ่งในหุ้น %}
{{ share.path }} {{ share.client }} {{ share.options }}
{% สิ้นสุดสำหรับ %}

จากนั้น ใช้กลุ่มสินค้าคงคลังและบทบาทใน playbook

เปลือก> cat playbook.yml
- โฮสต์: site_nfs_servers
  บทบาท:
    - my_nfs_role

เรียกใช้ playbook และสร้างไฟล์

เชลล์> ansible-playbook - ฉันโฮสต์ playbook.yml

เล่น [site_nfs_servers] *********************************************** **

งาน [my_nfs_role : template] ******************************************
เปลี่ยน: [ansibletarget1]
เปลี่ยน: [ansibletarget2]
 ...
เชลล์> ssh admin@ansibletarget1 cat /etc/exports.test
/my/first/share/path * rw,ซิงค์
/my/second/share/path * rw,ซิงค์,root_squash

เชลล์> ssh admin@ansibletarget2 cat /etc/exports.test
/another/shared/path/different/เซิร์ฟเวอร์ * ro,sync

ดู ตัวอย่างการตั้งค่า Ansible.


หากคุณต้องการเก็บหุ้นไว้ในวัตถุเดียวให้ใส่รายการลงใน group_vars. หากต้องการทำให้โค้ดง่ายขึ้น ให้แปลงรายการเป็นพจนานุกรม คุณสามารถใช้ได้ community.general.groupby_as_dict ตัวอย่างเช่น

เปลือก> cat group_vars/all.yml
ส่งออก:
  - เซิร์ฟเวอร์: "ansibletarget1"
    หุ้น:
      - เส้นทาง: "/ของฉัน/ครั้งแรก/แบ่งปัน/เส้นทาง"
        ลูกค้า: "*"
        ตัวเลือก: "rw,ซิงค์"
      - เส้นทาง: "/ของฉัน/วินาที/แชร์/เส้นทาง"
        ลูกค้า: "*"
        ตัวเลือก: "rw,ซิงค์,root_squash"
  - เซิร์ฟเวอร์: "ansibletarget2"
    หุ้น:
      - เส้นทาง: "/อีก/แชร์/เส้นทาง/แตกต่าง/เซิร์ฟเวอร์"
        ลูกค้า: "*"
        ตัวเลือก: "ro,ซิงค์"

exports_dict: "{{ ส่งออก|community.general.groupby_as_dict('เซิร์ฟเวอร์') }}"

ให้

  exports_dict:
    ansibletarget1:
      เซิร์ฟเวอร์: ansibletarget1
      หุ้น:
      - ลูกค้า: '*'
        ตัวเลือก: rw,ซิงค์
        เส้นทาง: /my/first/share/path
      - ลูกค้า: '*'
        ตัวเลือก: rw,ซิงค์,root_squash
        เส้นทาง: /my/second/share/path
    ansibletarget2:
      เซิร์ฟเวอร์: ansibletarget2
      หุ้น:
      - ลูกค้า: '*'
        ตัวเลือก: ro, ซิงค์
        เส้นทาง: /another/shared/path/different/server

จากนั้นแก้ไขเทมเพลต สิ่งนี้ควรสร้างไฟล์เดียวกันกับเมื่อก่อน

เชลล์> บทบาทของแมว/my_nfs_role/templates/exports.j2 
{% สำหรับส่วนแบ่งใน exports_dict[inventory_hostname]['shares'] %}
{{ share.path }} {{ share.client }} {{ share.options }}
{% สิ้นสุดสำหรับ %}

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา