Ansible में मल्टीलाइन शेल स्क्रिप्ट कैसे करें


125

अभी मैं किसी स्क्रिप्ट में शेल स्क्रिप्ट का उपयोग कर रहा हूं जो कि कई लाइनों पर होती तो अधिक पठनीय होती

- name: iterate user groups
  shell: groupmod -o -g {{ item['guid'] }} {{ item['username'] }} ....more stuff to do
  with_items: "{{ users }}"

बस यह निश्चित नहीं है कि अन्सिबल शेल मॉड्यूल में मल्टीलाइन स्क्रिप्ट की अनुमति कैसे दी जाए


1
इसके अलावा ansible 'स्क्रिप्ट' कमांड का उपयोग करने पर विचार करें और एक बाहरी फाइल का उपयोग करें
जेसन

जवाबों:


273

अपनी प्लेबुक में Ansible YAML सिंटैक्स का उपयोग करता है। YAML में कई ब्लॉक ऑपरेटर हैं:

  • >एक तह ब्लॉक ऑपरेटर है। यही है, यह रिक्त स्थान द्वारा एक साथ कई लाइनों को जोड़ता है। निम्नलिखित सिंटैक्स:

    key: >
      This text
      has multiple
      lines

    मूल्य निर्दिष्ट हैं This text has multiple lines\nकरने के लिए key

  • |चरित्र एक शाब्दिक ब्लॉक ऑपरेटर है। यह संभवतः वही है जो आप बहु-पंक्ति शेल स्क्रिप्ट के लिए चाहते हैं। निम्नलिखित सिंटैक्स:

    key: |
      This text
      has multiple
      lines

    मूल्य निर्दिष्ट हैं This text\nhas multiple\nlines\nकरने के लिए key

आप इस तरह के बहुस्तरीय खोल स्क्रिप्ट के लिए इसका उपयोग कर सकते हैं:

- name: iterate user groups
  shell: |
    groupmod -o -g {{ item['guid'] }} {{ item['username'] }} 
    do_some_stuff_here
    and_some_other_stuff
  with_items: "{{ users }}"

एक चेतावनी है: उत्तर देने योग्य shellआदेश के लिए कुछ जानदार हेरफेर करता है , इसलिए जबकि ऊपर आम तौर पर उम्मीद के मुताबिक काम करेगा, निम्नलिखित नहीं होगा:

- shell: |
    cat <<EOF
    This is a test.
    EOF

Ansible वास्तव में उस पाठ को प्रमुख स्थानों के साथ प्रस्तुत करेगा, जिसका अर्थ है कि शेल कभी भी EOFपंक्ति की शुरुआत में स्ट्रिंग नहीं ढूंढेगा । आप cmdइस तरह के पैरामीटर का उपयोग करके Ansible के अनपेक्षित उत्तराधिकार से बच सकते हैं :

- shell:
    cmd: |
      cat <<EOF
      This is a test.
      EOF

27
शानदार उत्तर
ब्रायन शिकार

18

https://support.ansible.com/hc/en-us/articles/201957837-How-do-I-split-an-action-into-a-multi-line-format-

उल्लेख YAML लाइन निरंतरता।

एक उदाहरण के रूप में (2.0.0.2 ansible के साथ की कोशिश की):

---
- hosts: all
  tasks:
    - name: multiline shell command
      shell: >
        ls --color
        /home
      register: stdout

    - name: debug output
      debug: msg={{ stdout }}

शेल कमांड एक लाइन में ढह गई है, जैसे कि ls --color /home


3
हाँ, लेकिन खोल >में एक बहुत विशिष्ट अर्थ है। मैंने यह कोशिश की और यह उम्मीद के मुताबिक काम नहीं किया।
एडगर मार्टिनेज

6
यही कारण है कि यह केवल पहली पंक्ति में है, बाद वाले लोगों में नहीं। यह मेरे लिए ठीक 2.0 के साथ काम किया, जैसा कि मैंने लिखा था, हालांकि यह 1.9.1 के साथ पूर्ण एलएस आउटपुट को प्रिंट नहीं करता था। आपने किस संस्करण का उपयोग किया है?
मार्सेलो रोमानी

लिंक मर चुका है।
कीनोरब

यह 2016 से है, ये चीजें होती हैं।
मार्सेलो रोमानी

3

ईओएफ परिसीमन से पहले एक स्थान जोड़ना सीएमडी से बचने की अनुमति देता है:

- shell: |
    cat <<' EOF'
    This is a test.
    EOF
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.