जटिल-आर्गन फॉर्म का उपयोग करके अन्सिबल को फ्री-फॉर्म कमांड पारित करना


9

मैं प्रोग्रामेटिकली एन्सिबल प्लेबुक का उपयोग कर रहा हूँ। सामान्य तौर पर, क्योंकि playbooks सिर्फ YAML हैं, यह सीधा है। हालाँकि, "सरल" key=valueफ़ॉर्म का उपयोग करते समय , playbooks शुद्ध YAML नहीं होते हैं - इनमें अंतर्निर्मित सामग्री shlexसम्मिलित होती है।

इस रूप में अस्पष्टता से बचने के लिए (जो है key=valueजोड़ी आदेश के लिए एक तर्क या ansible के लिए एक तर्क?), और पार्स और उत्पन्न, मैं बिना शर्त जटिल आर्ग तंत्र में उदाहरण के द्वारा प्रदर्शन उपयोग कर रहा हूँ करने के लिए केवल एक ही प्रारूप है ansible -एक्सप्लस रिपॉजिटरी

यह निम्नलिखित प्रकार के एक सिंटैक्स का उपयोग करता है:

action: module-name
args:
  key1: value1
  key2: value2

... जो अच्छा और अच्छा है। हालाँकि, जब इस फॉर्म को shellया commandमॉड्यूल के लिए उपयोग करने की कोशिश की जाती है ( जिसका प्रलेखन वास्तविक कमांड का वर्णन करता है जिसे नाम दिए गए तर्क में पारित किया जाता है free_form), यह अच्छी तरह से काम नहीं करता है:

action: shell
args:
  free_form: echo hello_world >/tmp/something
  creates: /tmp/something

जब आह्वान किया जाता है, तो यह निम्नलिखित चलता है:

/bin/sh -c " free_form='echo hello_world >/tmp/something'  "

... जो बहुत ज्यादा नहीं है जो मैं पूरा करने की कोशिश कर रहा हूं।

शुद्ध मिक्सएल सिंटैक्स का उपयोग करके "फ्री-फॉर्म" कमांड लेने के लिए सटीक मॉड्यूल का उपयोग करने का सही तरीका क्या है?

जवाबों:


5

संक्षिप्त उत्तर: उपयोग नहीं करते हैं command, raw, script, या shellमॉड्यूल। अपने स्वयं के मॉड्यूल को लिखें जो कमांड को "सामान्य" तर्क के रूप में स्वीकार करता है।

लंबा जवाब:

ज्यादातर मामलों में, आप यह कर सकते हैं:

- shell: echo hello_world > /tmp/something
  args:
    creates: /tmp/something

हालाँकि, यह कुछ धार मामलों में विफल रहता है:

- shell: echo hello_world > creates=something
  args:
    creates: creates=something  # The file is named "creates=something"

मैं इसे संभालने का एक सामान्य तरीका नहीं जानता, लेकिन एक विशिष्ट समाधान है:

- shell: echo hello_world > "creates=something"
  args:
    creates: creates=something

क्या कोई डेटा संरचना है जो मैं इसे बनाने के लिए किसी भी आज्ञाकारी YAML जनरेटर को पास कर सकता हूं - shell: ...? यदि यह संरचना कुछ है जो केवल मज़बूती से हाथ से उत्पन्न हो सकती है, तो यह कुछ हद तक सवाल को हरा देती है।
चार्ल्स डफी

@CharlesDuffy: मुझे नहीं लगता कि आप ...सामान्य रूप से भाग से बच सकते हैं । आप को देखो, तो library/commands/command, आप एक बहुत उदार रेगुलर एक्सप्रेशन मिलान मिल जाएगा creates=, removes=, chdir=, और इतने पर। यदि आपको गारंटी देने की आवश्यकता है कि किसी भी कमांड को पारित किया जा सकता है, तो आपको अपना मॉड्यूल लिखना होगा।
स्नोबॉल

फेयर 'नफ। यह मेरे दिमाग में एक महत्वपूर्ण डिजाइन मिसफिट्योर है ... लेकिन, ठीक है, यह वही है।
चार्ल्स डफी

0

इसे अब Ansible प्रलेखन में संबोधित किया गया है ।

# You can also use the 'args' form to provide the options. This command
# will change the working directory to somedir/ and will only run when
# /path/to/database doesn't exist.
- command: /usr/bin/make_database.sh arg1 arg2
  args:
    chdir: somedir/
    creates: /path/to/database

ध्यान दें कि 'free_form' नाम का कोई पैरामीटर नहीं है।


क्या जोड़ों की मौजूदगी से किसी को बाहर निकलने से argsरोका k=vजाता है command, क्या कोई मौजूद होना चाहिए? (यदि ऐसा है, तो यह अस्पष्टता को सफाई से संबोधित करता है; अन्यथा, यह अभी भी मौजूद होगा)।
चार्ल्स डफी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.