उन भूमिकाओं से सामान कैसे साफ़ करें जो किसी सर्वर पर अधिक उपयोग नहीं की जाती हैं?


15

मान लीजिए कि मेरे पास एक मेजबान है, जो अन्य चीजों के बीच है, एक वेब सर्वर, जहां संबंधित Ansible भूमिका स्थापित करता है nginx, कुछ आवश्यक कॉन्फ़िगरेशन करता है /etc/nginx, और फ़ायरवॉल में पोर्ट 80 और 443 खोलता है।

कुछ बिंदु पर मैं चाहता हूं कि विशेष रूप से होस्ट को वेब सर्वर नहीं बनना चाहिए, क्योंकि किसी कारण से मैंने उस सेवा को कहीं और स्थानांतरित कर दिया। बस [webservers]इन्वेंट्री से सर्वर को हटाने से सर्वर में कचरा छोड़ जाएगा। आदर्श रूप में, मैं स्थापना रद्द करना चाहते हैं nginx, को दूर /etc/nginxनिर्देशिका (और कुछ अन्य निर्देशिका), और फ़ायरवॉल में पोर्ट 80 और 443 को बंद करें।

कठपुतली में मैं यह कर सकता हूँ। एक होस्ट जो एक वेब सर्वर है, उसके कॉन्फ़िगरेशन में कुछ इस तरह होगा:

class { 'nginx':
  ensure => present,
}

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

क्या अधिक है, मुझे लगता है कि कठपुतली फ़ायरवॉल मॉड्यूल स्वचालित रूप से फ़ायरवॉल नियमों को हटा देता है जो कि प्रकट में किसी भी अधिक नहीं मिल सकते हैं; इसलिए मुझे लगता है कि, फ़ायरवॉल के लिए, आपको ऊपर "अनुपस्थित" चीज़ करने की ज़रूरत नहीं है, फ़ायरवॉल स्वचालित रूप से वैसे भी बंद हो जाएगा।

मैं इन चीजों को कैसे प्राप्त कर सकता हूं?


1
हाइपोथेटिकल प्रश्न वास्तव में इस विषय पर नहीं हैं यहां मुझे लगता है, हालांकि आपका प्रश्न स्वयं योग्यता के बिना नहीं है। इसके बजाय "चलो बहाना ..." rephrase और उदाहरण के लिए कहते हैं कि "कठपुतली में मैं एक सर्वर भूमिका बदल सकते हैं और स्थापना रद्द करें nginx जो बदलकर पहले से स्थापित किया गया था कर सकते हैं ensure => present करने के लिए ensure => absentजो भी ... कैसे एक ही ansible के साथ क्या करना होगा" आदि आदर्श रूप में आप पहले से ही कोशिश कर चुके हैं।
HBruijn

2
मैं यह तर्क दूंगा कि वास्तव में इस प्रकार की चीज़ के लिए डिज़ाइन नहीं किया गया है। यह प्रतिलिपि प्रस्तुत करने योग्य, डिस्पोजेबल सर्वर पर लक्षित है। यदि आप किसी मशीन को वेबसर्वर नहीं बनाना चाहते हैं, तो आप इसे फिर से तैयार करने के बजाय इसे मिटा देते हैं (या इसे क्लाउड उदाहरण है तो समाप्त कर सकते हैं)।
सिजॉयज

@ceejayoz मैंने सबसे ज्यादा जो पढ़ा है, वह है अंसिबल्स के बारे में ओर्सन स्कॉट कार्ड कार्ड के एंडर्स गेम और सीक्वल्स में, लेकिन आप जो कहते हैं वह क्लाउड ऑर्केस्ट्रेशन में बहुत मायने
रखता है

@ceejayoz: मैं वर्तमान में मल्टी-सर्वर सेटअप के लिए Ansible का उपयोग नहीं करता, लेकिन छोटे स्वायत्त सर्वरों को कॉन्फ़िगर करने के लिए करता हूं। मुझे लगता है कि यह एक वैध उपयोग है। तो एक सर्वर में nginx + django + PostgreSQL हो सकता है। अगर बाद में मैं कहीं और nginx या nginx + django डालने का फैसला करता हूं, तो पूरे सर्वर को मिटा देना चाहिए और बैकअप से PostgreSQL को वापस लाने की आवश्यकता होगी, यह सबॉप्टीमल (डाउनटाइम का उल्लेख नहीं करने के लिए) होगा।
एंटनी क्रिस्टोफ़ाइड्स

जवाबों:


10

अन्सिबल के साथ, आप वास्तव में किसी भी तरह से यह नहीं करेंगे कि आप इसे कठपुतली के साथ कैसे करेंगे।

आपके उदाहरण में आप कहां सेट होंगे

class { 'nginx':
  ensure => absent,
}

आप उस कठपुतली मॉड्यूल के लेखक पर भरोसा कर रहे हैं जो सब कुछ हटाने के साथ निपटने के लिए आवश्यक कोड लिखा है। हर कठपुतली मॉड्यूल के पास यह नहीं है।

इसी तरह, अन्सिबल के साथ, आपके पास ऐसी भूमिकाएं हो सकती हैं जिनके पास इसे स्थापित करने के साथ-साथ इसे स्थापित करने के लिए दोनों आवश्यक कदम हैं। अंतर केवल यह है कि दोनों को कैसे आमंत्रित किया जाए।

एक दृष्टिकोण वह हो सकता है जहां प्रश्न की भूमिका व्यवहार को टॉगल करने के लिए एक चर को उजागर करती है। उदाहरण के लिए, कि nginx भूमिका एक चर ले सकता है nginx_stateजो मान लेता है installedऔर absent

भूमिका में tasks/main.yml, भूमिका लेखक की तर्ज पर कुछ हो सकता है ..

- include: install.yml
  when: nginx_state|default('present') == "present"

- include: uninstall.yml
  when: nginx_state|default('present') == "absent"

.. संबंधित इंस्टॉल / अनइंस्टॉल लॉजिक के साथ उन दो सशर्त रूप से शामिल फ़ाइलों के बीच विभाजित किया जा रहा है।

उत्तरोत्तर भूमिकाओं को भी नस्ट किया जा सकता है। एक ही तरीके से ऐसा करने के लिए, एक भूमिका लेखक उदाहरण के लिए nginxइसके अंदर एक और भूमिका के साथ एक भूमिका प्रदान कर सकता है, जिसे कहा जाता है uninstalled। आप तब कर सकते हैं:

- name: Uninstall nginx
  hosts: some_group
  roles:
    - nginx/uninstalled

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


1
जबकि तकनीकी रूप से आप तर्कों को सीधे भूमिकाओं में पारित कर सकते हैं, मैं नेस्टेड भूमिका का उपयोग करने की सलाह दूंगा। मुझे प्लेबुक में कुछ भूमिका देखकर वाकई बहुत अजीब लगेगा, यह वास्तव में प्लेबुक के निष्पादन पर अनइंस्टॉल हो जाएगा क्योंकि इस तरह से परिभाषित चर में। नेस्टेड भूमिका के माध्यम से स्पष्ट होने से यह बहुत साफ लगता है। तकनीकी रूप से भूमिका के लिए तर्कों को पारित करना संभव है ( - { role: nginx, state: absent }), लेकिन यह मुझे बेहद वाचाल लगता है। नेस्टेड भूमिका के लिए एकमात्र दोष जो मैंने देखा है, वह यह था कि मुझे माता-पिता से डिफ़ॉल्ट संस्करण लिंक करने की आवश्यकता थी।
bogdan.mustiata

roles: -nginx/uninstalledकाम करने के लिए आपको क्या करने की आवश्यकता है ? मैंने सभी जगह देखा है, लेकिन किसी भी तरह से नेस्टिंग भूमिकाओं पर कोई प्रलेखन नहीं पा सकता है जो मुझे ऐसा करने की अनुमति देगा।
समुच्चय

1

चूंकि आपके पास Ansible में आपका कॉन्फ़िगरेशन / प्रोविजनिंग है, आप बस पूरे सर्वर को उड़ा सकते हैं, नए सिरे से रीइंस्टॉल / प्रावधान कर सकते हैं और इसे काम करने के लिए एक अच्छा साफ ज्ञात राज्य है।

यदि आप वास्तव में इसे अन्य उद्देश्यों के लिए "पुन: कॉन्फ़िगर" करना चाहते हैं तो आपको एक नई प्लेबुक बनाने की आवश्यकता होगी जो आवश्यक सफाई कार्यों को पूरा करती है।

जहाँ तक मुझे जानकारी है, सभी Ansible पैकेजिंग मॉड्यूलstate=absent यह सुनिश्चित करने के लिए समर्थन करते हैं कि किसी दिए गए पैकेज को आपके सर्वर पर स्थापित नहीं किया गया है। इसके अतिरिक्त, aptमॉड्यूल में purge=yesपैरामीटर है जो किसी भी शेष अनुकूलित कॉन्फ़िगरेशन फ़ाइलों को साफ करेगा।

आप यह पुष्टि करने के लिए कार्य भी बना सकते हैं कि पोर्ट 80 फ़ायरवॉल है। हालाँकि, चूंकि आपके पास उस पोर्ट पर चलने वाली कोई प्रक्रिया नहीं होगी, इसलिए इसे फ़ायरवॉल करने से आपके सर्वर की सुरक्षा पर कोई फर्क नहीं पड़ेगा।


इसे जोड़ने के लिए, मैं शर्त लगा रहा हूं कि उस भूमिका के अधिकांश नाटकों को state=absentजोड़ा जा सकता है । वहाँ एक अच्छा मौका है जो आपके द्वारा किए गए कॉन्फ़िगरेशन परिवर्तनों का एक अच्छा बहुमत मिटा देगा या पूर्ववत कर देगा। भूमिका कितनी बड़ी है, इस पर निर्भर करते हुए, यह परीक्षण करने के लिए एक वास्तविक PITA हो सकता है।
क्रिस्टोफर कारेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.