มีวิธีเรียกใช้ with_items วนซ้ำใน Ansible หรือไม่


12

ฉันใช้ Ansible 2.2 แต่สามารถอัพเกรดได้ถ้ามันช่วยได้

ฉันเห็นสิ่งนี้และรู้สึกตื่นเต้นมาก แต่ดูเหมือนจะไม่ได้อยู่ในเอกสาร Ansible รุ่น (หรือใด ๆ )

ปัญหาที่ฉันพยายามแก้ไขคือฉันมีผู้ใช้ 1,000 คนที่ฉันต้องจัดการในกล่อง Centos

ใช้เวลาสักครู่ในการเรียกใช้งานนี้ตามลำดับ และยิ่งน่ารำคาญยิ่งขึ้นทุกสิ่งปรากฏขึ้นเมื่อมีการเปลี่ยนแปลงเนื่องจากคำสั่ง "หมดอายุ" ในโมดูลผู้ใช้จะทำเครื่องหมายสิ่งที่เปลี่ยนแปลงเสมอ

สิ่งนี้ดูมีแนวโน้มด้วยเช่นกัน แต่ใช้เวลาเท่ากันในการรันแต่ละคำสั่งในลูป with_items และไม่ได้ทำงานเร็วขึ้น (ฉันไม่เคยใส่ใจที่จะรอนานจนจบ)

การข้ามงานเร็วมาก (เร็วกว่าใน Ansible 2.0) ถ้าฉันไม่สามารถหาวิธีที่จะทำให้การทำงานแบบขนานนี้ฉันคิดว่าฉันจะย้อนกลับไปและหาวิธีที่จะข้ามงานที่ไม่มีจุดหมายและถ้าทั้งหมด อื่นล้มเหลวฉันจะเขียนโมดูลของตัวเอง แต่ดูเหมือนว่าฉันควรจะทำสิ่งนี้ได้เร็วขึ้นใน Ansible


นี่คือสิ่งที่ฉันต้องการเรียกใช้ในแบบขนาน host_authorizationsคือรายการชื่อผู้ใช้และข้อมูลอื่น ๆ

  - name: Create/modify OS user accounts
    user: name={{ item.username }} group=sshusers shell=/bin/bash home="/home/selinux-modules/{{ item.username }}" state=present expires={{item.expiredate|default(omit)}}
    with_items: "{{ host_authorizations }}"
    tags: full_maintenance

โปรดระบุข้อมูลโค้ด ไม่อย่างนั้นมันยากที่จะช่วย
030

@ 030 มีตัวอย่างฉันคิดว่ามันช่วยนิดหน่อยสำหรับบริบท ฉันสนใจแนวคิดมากขึ้นหากมีวิธีการทำงาน (ในวง) จริงๆในแบบคู่ขนานบนโฮสต์เดียวกัน ฉันรู้ว่าฉันสามารถทำสิ่งต่าง ๆ มากมายด้วย async แต่ไม่มากกับ with_items
Peter Turner

ดังนั้นโดยทั่วไปหากผู้ใช้ 1,000 รายต้องถูกสร้างขึ้นมันควรจะเสร็จสิ้นอย่างรวดเร็วเท่ากับการสร้างผู้ใช้เพียงคนเดียว น่าสนใจทำไมไม่ใช้บางอย่างเช่น LDAP
030

1
อย่างจริงจังคุณกำลังมุ่งหน้าไปสู่เส้นทางแห่งความเจ็บปวดฉันไม่คิดว่าจะมีใครจัดการมากกว่าหนึ่งโหลบัญชีที่มีฐานบัญชีท้องถิ่นทันทีที่จำนวนผู้ใช้เพิ่มขึ้นฉันถือว่าทุกคนย้ายไปที่ระบบบัญชีส่วนกลาง แบ็กเอนด์ ldap บางตัว (อาจเป็นไดเรกทอรีที่ใช้งานอยู่) จากนั้นตั้งค่าเวลาหมดอายุและคีย์สาธารณะเป็นแอตทริบิวต์ของฐานกลางนี้จากนั้นใช้สิ่งต่าง ๆ เช่น sss_ssh_authorizedkeys เพื่อให้เซิร์ฟเวอร์ ssh ได้รับคีย์ที่ได้รับอนุญาตจากฐานกลางนี้
Tensibai

2
ฉันไม่เห็นด้วยกับสิ่งนี้ว่าเป็นสิ่งที่เข้าใจได้ (บอกใบ้ว่ามันไม่ได้สร้าง / จัดการผู้ใช้จำนวนมาก) ฉันยืนตามจุดที่บัญชีไม่ควรจัดการบนฐานบัญชีท้องถิ่นในปริมาณมาก (ความจริงพวกเขาไม่ใช่บัญชีมนุษย์ที่ไม่เกี่ยวข้องกับปัญหาต่อไป)
Tensibai

คำตอบ:


13

ดังที่ @webKnja พูดถึงสิ่งนี้เป็นไปได้ด้วยasyncโหมด ฉันเพิ่งค้นพบมันด้วยตัวเองและเรียนรู้ว่าคุณสามารถใช้มันใน 3 วิธีที่แตกต่างกันขึ้นอยู่กับความต้องการของคุณ

  1. ดำเนินการและสำรวจผลลัพธ์สังเกตเห็นว่าpoll:5นี่จะสำรวจผลลัพธ์ทุก 5 วินาที คุณอาจประหยัดเวลาด้วยวิธีนี้

    - name: My long runing task
      some_module_name:
        ip: "{{item.fabric}}"
        username: "{{user}}"
        password: "{{password}}"
        secret: "{{secret}}"
      loop: "{{zoning_list}}"
      register: _alias_vc_0
      async: 60
      poll: 5
    
  2. ดับแล้วลืม poll: 0นี่คือตัวเลือกที่รวดเร็วมากเนื่องจาก Ansible เป็นเพียงการยิงภารกิจเหล่านั้นออกไป ข้อเสียคือเราไม่รู้ว่าผลของงานคือchanged: True/Falseอะไร แน่นอนว่ามันเป็นข้อเสียถ้าคุณใส่ใจกับข้อเสนอแนะ;)

    name: My long runing task
    some_module_name:
      ip: "{{item.fabric}}"
      username: "{{user}}"
      password: "{{password}}"
      secret: "{{secret}}"
    loop: "{{zoning_list}}"
    register: _alias_vc_0
    async: 60
    poll: 0
    
  3. เริ่มต้นและลืมไปasync_statusซินแท็คซ์ของงานนั้นเหมือนกันกับตัวอย่างที่2ไม่ว่ามันจะต้องใช้งานasync_statusอะไรเพิ่มเติม นี้เป็นที่ชื่นชอบเพราะมันค่อนข้างเร็ว (เร็วขึ้นแล้ววนลูปปกติหรือexecute and poll) และช่วยให้คุณจับข้อเสนอแนะถึงแม้ว่าจะต้องจัดการกับใหม่สำหรับคุณregisterasync_task

    retries: 20 - กี่ครั้งก่อนที่จะล้มเหลว

    delay: 2 - มีกี่วินาทีในการรอระหว่างการสำรวจความคิดเห็น

    - name: My long runing task
      some_module_name:
        ip: "{{item.fabric}}"
        username: "{{user}}"
        password: "{{password}}"
        secret: "{{secret}}"
      loop: "{{zoning_list}}"
      register: _alias_vc_0
      async: 60
      poll: 0
    
    
    - name: Wait for My long running task to finish
      async_status:
        id: "{{ item.ansible_job_id }}"
      register: _jobs_alias_vc_0
      retries: 20
      delay: 2
      until: _jobs_alias_vc_0.finished
      loop: "{{_alias_vc_0.results}}"
    

คำเตือนขึ้นอยู่กับภารกิจของคุณอาจไม่สามารถใช้asyncตัวเลือกได้ ฉันมีตัวอย่างที่ฉันโต้ตอบกับระบบซึ่งไม่สามารถจัดการคำขอหลายรายการสำหรับทรัพยากรเดียวกันได้ ฉันพบว่าasyncตัวเลือกทำงานได้ดีที่สุดหากฉันต้องทำงานเดียวกันกับหลาย ๆ โฮสต์ นั่นคือสิ่งที่ฉันสามารถ "บันทึก" เวลาส่วนใหญ่

เมื่อคุณโพสต์ลิงค์ไปยังเอกสาร Ansible ในคำถามฉันจะไม่ทำเช่นนั้น


@ ลูกไก่คุณอาจต้องการเปลี่ยนpollค่าเป็น 0 ในตัวอย่างที่ 3 นี่เป็นคำอธิบายที่น่าทึ่ง !! ขอบคุณ
Debanjan Basu

@DebanjanBasu ทุกคนสามารถแก้ไขได้ ฉันอาจเป็นคนที่อนุมัติในคิวรีวิว แต่คุณควรได้รับเครดิตสำหรับการแก้ไขเอง
ลูกไก่

การแก้ไขตัวละครตัวเดียวไม่ได้รับอนุญาตอย่างน่าเศร้า! :(
Debanjan Basu

2
ตัวเลือก 3 ใช้งานได้ดีขอบคุณ! หนึ่งความคิดเห็นว่า: เป็นอย่างน้อยเบิ้ล 2.8 async_statusต้องไม่jid id
EdwardTeach

4

เพื่อตอบคำถามของคุณ: ไม่ ณ ขณะนี้ Ansible ไม่สามารถวนซ้ำได้

ฉันจะใช้newusersแทนซึ่งทำขึ้นสำหรับการสร้างผู้ใช้จำนวนมาก สร้างไฟล์ที่มีผู้ใช้ทุกคนในนั้นคัดลอกไปยังโฮสต์และทำงานnewusers /path/to/user/listในcommandงาน


3

มันเป็นไปได้ที่จะบรรลุสิ่งนี้โดยใช้asyncโหมด โปรดหาข้อมูลอ้างอิงบางส่วนสำหรับวิธีการทำด้านล่าง

refs:

---

- name: Run tasks in parallel
  hosts: localhost
  connection: local
  gather_facts: no
  tasks:
    - name: Pretend to create instances
      command: "sleep {{ item }}"  # Instead of calling a long running operation at a cloud provider, we just sleep.
      with_items:
        - 6
        - 8
        - 7
      register: _create_instances
      async: 600  # Maximum runtime in seconds. Adjust as needed.
      poll: 0  # Fire and continue (never poll)

    - name: Wait for creation to finish
      async_status:
        jid: "{{ item.ansible_job_id }}"
      register: _jobs
      until: _jobs.finished
      delay: 5  # Check every 5 seconds. Adjust as you like.
      retries: 10  # Retry up to 10 times. Adjust as needed.
      with_items: "{{ _create_instances.results }}"

ในขณะที่ลิงก์เหล่านั้นอาจตอบคำถามหากพวกเขาพบว่าไม่มีอะไรเหลืออยู่ในคำตอบของคุณสำหรับผู้อ่านในอนาคตโปรดลองแสดงว่าสิ่งนี้จะช่วยแก้ปัญหาด้วยคำพูด / ตัวอย่างของคุณและออกจากลิงก์สำหรับรายละเอียดเพิ่มเติมเท่านั้น
Tensibai

ใช่ฉันไม่สามารถทำเครื่องหมายสิ่งนี้เป็นคำตอบจนกระทั่ง A. ) ฉันทดสอบและ B. ) วางรหัสที่เกี่ยวข้องไว้ที่นี่ แต่ขอบคุณที่ชี้นำฉันในทิศทางนี้
Peter Turner

ขออภัยฉันรีบแล้ว :)
webKnjaZ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.