ฉันจะมีลูปซ้อนกับรูปแบบ fileglob ได้อย่างไร


13

ฉันกำลังพยายามสร้างคีย์ SSH ที่ได้รับอนุญาตสำหรับกลุ่มผู้ใช้ใน Ansible ฉันมีusersตัวแปรตั้งค่าเช่นนั้น:

users:
  - { username: root, name: 'root' }
  - { username: user, name: 'User' }

ในบทบาทเดียวกันฉันยังมีชุดของไฟล์คีย์ที่ได้รับอนุญาตในfiles/public_keysไดเรกทอรีหนึ่งไฟล์ต่อหนึ่งคีย์ที่ได้รับอนุญาต:

roles/common/files/public_keys/home
roles/common/files/public_keys/work

ฉันต้องการคัดลอกคีย์สาธารณะไปยังผู้ใช้แต่ละคน

ฉันได้ลองใช้งานต่อไปนี้:

- name: copy authorized keys
  authorized_key: user={{ item.0.username }} key={{ item.1 }}
  with_nested:
    - users
    - lookup('fileglob', 'public_keys/*')

แต่item.1มีสายอักขระตัวอักษรไม่แต่ละเส้นทางของแฟ้มภายใต้"lookup('fileglob', 'public_keys/*')"files/public_keys

มีวิธีที่ฉันจะได้รับรายชื่อของfiles/public_keysไดเรกทอรีและคัดลอกกุญแจสาธารณะไปยังผู้ใช้แต่ละคนหรือไม่?

คำตอบ:


8

เคล็ดลับคือการแปลงค่าส่งคืน fileglob เป็นรายการผ่านsplitฟังก์ชั่นดังนั้นคุณสามารถวนซ้ำค่าต่างๆ:

- name: copy authorized keys
  authorized_key: 
    user: "{{ item.0.username }}"
    key: "{{ lookup('file', item.1) }}"
  with_nested:
    - "{{ users }}"
    - "{{ lookup('fileglob', 'public_keys/*').split(',') }}"

โปรดทราบว่าการใช้ตัวแปรเปล่าโดยไม่มี{{และ}}สำหรับwith_itemsถูกคัดค้านใน Ansible v2


คำตอบนี้ควรได้รับการยอมรับ
Beyers

0

คุณอาจต้องเขียนคำสั่งของคุณใหม่อย่างมีนัยสำคัญ แต่มีข้อกำหนดสำหรับการวนลูปมากกว่า fileglobs

จากตัวอย่าง:

- copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600
  with_fileglob:
    - /playbooks/files/fooapp/*

ตัวเลือกที่มีแนวโน้มอื่น ๆ คือการวนซ้ำผ่านองค์ประกอบย่อยซึ่งแสดงด้วยปุ่ม SSH


3
ฉันรู้ว่าคุณสามารถวนไฟล์ globs โดยใช้with_fileglob; ฉันไม่แน่ใจว่าจะใช้งานอย่างไรร่วมกับการวนซ้ำซ้อนกัน การวนซ้ำขององค์ประกอบย่อยสามารถใช้งานได้ แต่ฉันหวังว่าฉันไม่จำเป็นต้องระบุรายการทั้งหมดของคีย์ที่ฉันต้องการคัดลอกด้วยตนเองเนื่องจากฉันควรจะสามารถรับรายการwith_fileglobนั้นได้
mipadi

ฉันก็ไม่แน่ใจเหมือนกัน ข้อเสนอแนะที่ดีที่สุดถัดไปคือการปรากฏ#ansibleบนirc.freenode.netและดูว่าผู้เชี่ยวชาญด้านการมีความคิดที่สดใสใด ๆ
Tom O'Connor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.