Ansible: होस्ट द्वारा एक टास्क होस्ट कैसे चलाएं?


15

प्ले-लेवल पर, serial: 1हमें एक बार में पूरे प्ले वन होस्ट को चलाने की अनुमति देनी होगी। लेकिन मुझे यह आसान काम नहीं मिला। यह विशेष रूप से प्रासंगिक है, यदि प्रश्न में कार्य उचित लॉकिंग (जो भी कारण के लिए) नहीं करता है।

एक स्पष्ट उत्तर यह है कि इस कार्य को अपने ही खेल में रखा जाए। लेकिन वह भूमिकाओं में मदद नहीं करता है। ( serial: 1भूमिका का उपयोग करते हुए नाटक को करना वास्तव में सहज नहीं है।)

जवाबों:


12

यदि आप अपनी प्लेबुक में चरणों को करने में कोई समानता नहीं चाहते हैं, तो कांटा स्तर को 1 पर सेट करें:

ansible-playbook --forks=1 ...

आप इसे अपनी ansible cfg फ़ाइल में भी डाल सकते हैं:

[defaults]
forks=1

लेकिन अगर आप इसे व्यक्तिगत आधार पर चाहते हैं, तो ऊपर कमांड लाइन विकल्प का उपयोग करें।

संपादित करें:

serial: 1कुछ पूरी तरह से अलग करता है: यह बदले में प्रत्येक होस्ट के लिए प्लेबुक चलाने की तरह है, अगले होस्ट पर जाने से पहले पूरी प्लेबुक के पूरा होने की प्रतीक्षा कर रहा है। forks=1इसका मतलब है कि अगले होस्ट पर एक ही कार्य को चलाने से पहले एक होस्ट पर एक नाटक में पहला कार्य चलाएं, इसलिए अगले कार्य को छूने से पहले प्रत्येक होस्ट के लिए पहला कार्य चलाया जाएगा।

तो आप forks=1सिर्फ एक नाटक के लिए चाहते हैं; दुर्भाग्य से वर्तमान में यह संभव नहीं है।


2
मैं इसे पूरी प्लेबुक पर सेट करना नहीं चाह रहा था। यह गैर-दानेदार के लिए बहुत कुछ है। serial: 1चलो मुझे कम से कम एक नाटक पर सेट करें। लेकिन मैं इसे केवल एक नाटक के उप-समूह पर सेट करना चाहता हूं (जो कि कभी इसका सही नाम है। मुझे लगा, यह "कार्य" था, लेकिन ऊपर टिप्पणी असहमति प्रकट करती है)।
एलोरनड

3
serial: 1कुछ पूरी तरह से अलग करता है: यह बदले में प्रत्येक होस्ट के लिए प्लेबुक चलाने की तरह है, अगले होस्ट पर जाने से पहले पूरी प्लेबुक के पूरा होने की प्रतीक्षा कर रहा है। forks=1इसका मतलब है कि अगले होस्ट पर एक ही कार्य को चलाने से पहले एक होस्ट पर एक नाटक में पहला कार्य चलाएं , इसलिए अगले कार्य को छूने से पहले प्रत्येक होस्ट के लिए पहला कार्य चलाया जाएगा। तो आप forks=1सिर्फ एक नाटक के लिए चाहते हैं; दुर्भाग्य से वर्तमान में यह संभव नहीं है।
wurtel

अच्छी बात! क्या आप उत्तर में मन जोड़ेंगे?
Elrond

2

इस समस्या के लिए एक समाधान है - एक मेजबान (या एक समूह) की सूची को पास कर सकता है with_itemsऔर फिर delegate_toइस सूची के साथ उपयोग कर सकता है। इस तरह कार्य को होस्ट द्वारा होस्ट निष्पादित किया जाएगा।

उदाहरण के लिए:

- name: start and enable rabbitmq (run task host by host)
  service:
    name: "rabbitmq-server"
    state: "started"
    enabled: true
  delegate_to: "{{ item }}"
  with_items: "{{ groups['rabbitmq-cluster'] }}"
  run_once: true

उन लोगों के लिए जो अंदर क्यों run_once: trueहै, इसे बाहर निकालने की कोशिश करें। आपको पसंद नहीं होगा कि क्या होता है। (इतने बार दोहराया गया
आआआह्ह्ह्ह

1

यदि आप इसे एक मशीन पर निष्पादित कर रहे हैं, तो एक से अधिक होस्ट के लिए अनन्य ताले का मुद्दा उठता है। तो आपको सभी होस्ट के लिए एक-एक करके निष्पादित करना चाहिए। इसके लिए आपको --forks=1ansible playbook कमांड को कॉल करते समय सेट करना होगा । एफओआर उदाहरण: ansible-playbook webserver.yml --forks=1जहां webserver.yml में आपके अंदर app01 और app02 है[webserver]


0

सोचें कि आप क्या चाहते हैं

run_once: सच


4
nope: "run_once: true" का अर्थ है मेजबानों की सूची में ठीक एक मेजबान के लिए कार्य को चलाना। मैं इसे सूची में प्रत्येक मेजबान के लिए चलाना चाहता हूं, लेकिन एक के बाद एक।
Elrond

0

स्थानीय रूप से चलाए जा सकने वाले कमांड के लिए, प्ले में सभी मेजबानों पर पुनरावृति करने के लिए एक लूप का उपयोग करें। यह केवल तभी काम करता है जब कमांड स्थानीय रूप से चलाया जा सकता है। यदि आप चाबियाँ सेट कर रहे हैं, तो इस तरीके से एक-एक करके दूरस्थ मशीनों में ssh के साथ कमांड चला सकते हैं, लेकिन वृद्धि के बारे में बात करते समय यह मुश्किल हो जाता है।

ईजी:

- name: Init New Appliances - Remove the known hosts entry for the server in case it has changed
  run_once: yes
  connection: local
  become: no
  command: "ssh-keygen -R {{ item }}"
  with_items:
  - "{{ inventory_hostname }}"

1
आपको मेजबान के नाम की बजाय मेजबान की सूची प्रदान करनी होगी inventory_hostname, अन्यथा लूप का कोई मतलब नहीं है।
कॉन्स्टेंटिन सुवोरोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.