क्या अंसिबल में समानांतर में with_items छोरों को चलाने का एक तरीका है?


12

मैं अंसिबल 2.2 चला रहा हूं, लेकिन अगर यह मदद करता है तो अपग्रेड कर सकता है।

मैंने देखा कि यह और बहुत उत्साहित थे, लेकिन यह Ansible प्रलेखन के इस (या किसी भी) संस्करण में होना प्रतीत नहीं होता।

मैं जिस समस्या को हल करने की कोशिश कर रहा हूं, क्या मुझे 1000 उपयोगकर्ता मिले हैं जिन्हें मुझे एक Centos बॉक्स पर प्रबंधित करने की आवश्यकता है।

इस कार्य को धारावाहिक रूप से चलाने में काफी समय लगता है। और इससे भी अधिक कष्टप्रद, सब कुछ बदल के रूप में दिखाता है क्योंकि उपयोगकर्ता मॉड्यूल पर "एक्सपायर" कमांड हमेशा बदले हुए चीज़ को चिह्नित करता है।

यह भी आशाजनक लग रहा था, लेकिन इसे with_items लूप में प्रत्येक कमांड को चलाने के लिए समान समय लगा और कोई तेजी नहीं आई (मैंने अंत तक पहुंचने के लिए लंबे समय तक इंतजार करने की जहमत नहीं उठाई)।

लंघन कार्य अब तेज़ है (यह बहुत तेजी से अंसिबल 2.0 में था), अगर मैं यह पता नहीं लगा सकता कि इस काम को समानांतर में कैसे बनाया जाए, मुझे लगता है कि मैं वापस जाऊंगा और यह पता लगाऊंगा कि व्यर्थ कार्यों को कैसे छोड़ें और यदि सभी और विफल रहता है, मैं अपना खुद का मॉड्यूल लिखूंगा। लेकिन ऐसा लगता है कि मुझे यह सब तेजी से अन्सिबल में करने में सक्षम होना चाहिए।


यह वही है जो मैं समानांतर में चलाना चाहता हूं, 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 के साथ इतना नहीं।
पीटर टर्नर

तो मूल रूप से यदि 1000 उपयोगकर्ता बनाने हैं तो इसे केवल एक उपयोगकर्ता बनाने के रूप में तेजी से समाप्त किया जाना चाहिए। दिलचस्प है, क्यों LDAP की तरह कुछ का उपयोग नहीं?
030

1
गंभीरता से, आप दर्द के रास्ते की ओर बढ़ रहे हैं, मुझे नहीं लगता कि स्थानीय खाता आधार वाले किसी भी खाते में एक दर्जन से अधिक खाते हैं, जैसे ही उपयोगकर्ताओं की संख्या बढ़ती है, मुझे लगता है कि हर कोई एक केंद्रीकृत लेखा प्रणाली की ओर बढ़ता है, सामान्य रूप से कुछ ldap बैकएंड (सक्रिय निर्देशिका हो सकती है) और फिर इस केंद्रीय आधार की विशेषताओं के रूप में समाप्ति समय और सार्वजनिक कुंजी सेट करें फिर sss_ssh_authorizedkeys जैसी चीजों का उपयोग करें ताकि ssh सर्वर को इस केंद्रीय आधार से अधिकृत कुंजी प्राप्त हो सके।
तेनसीबाई

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) है और आपको प्रतिक्रिया पर कब्जा करने की अनुमति देता है, हालांकि registerआपके लिए नए से निपटने की आवश्यकता होगी async_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. यह एक अद्भुत व्याख्या है !! Thnx।
देबंजन बसु

@DebanjanBasu कोई भी व्यक्ति सुझाए गए संपादन कर सकता है। मैं वह हो सकता हूं जो समीक्षा कतारों में इसे अनुमोदित करता है, लेकिन आपको संपादन का श्रेय स्वयं को मिलना चाहिए।
चूजों

एक चरित्र संपादन दुख की अनुमति नहीं है! :(
देबंजन बसु

2
विकल्प 3 महान काम करता है, धन्यवाद! एक टिप्पणी हालांकि: कम से कम Ansible 2.8 के रूप में, की async_statusआवश्यकता है jid, नहीं id
एडवर्डटेच

4

आपके प्रश्न का उत्तर देने के लिए: नहीं, जैसा कि अब तक के समानांतर में लूप नहीं चल सकता है।

मैं 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 }}"

हालांकि वे लिंक इस सवाल का जवाब दे सकते हैं कि क्या वे टूटने के लिए आते हैं, तो भविष्य के पाठकों के लिए आपके जवाब में कुछ भी नहीं बचा है, कृपया यह दिखाने की कोशिश करें कि यह कैसे समस्या को अपने शब्दों / छूट के साथ हल करने में मदद करेगा और लिंक को केवल अधिक विस्तृत विवरण के लिए छोड़ देगा।
तेंसिबाई

हाँ, मैं इसे उत्तर के रूप में चिह्नित नहीं कर सकता जब तक ए) मैं इसे परीक्षण करता हूं और बी) प्रासंगिक कोड यहां रखा गया है। लेकिन फिर भी मुझे इस दिशा में इशारा करने के लिए धन्यवाद।
पीटर टर्नर

क्षमा करें, मुझे यह जल्दी थी :)
webKnjaZ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.