আনসিবলে মাল্টিলাইন শেল স্ক্রিপ্ট কীভাবে করবেন


125

এই মুহূর্তে আমি জবাবদিহি করে একটি শেল স্ক্রিপ্ট ব্যবহার করছি যা এটি একাধিক লাইনে থাকলে আরও অনেক বেশি পাঠযোগ্য

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

কীভাবে উত্তরযোগ্য শেল মডিউলটিতে মাল্টলাইন স্ক্রিপ্টকে মঞ্জুরি দেওয়া যায় তা নিশ্চিত নন


1
জবাবদিহি 'স্ক্রিপ্ট' কমান্ডটি ব্যবহার করে বিবেচনা করুন এবং একটি বাহ্যিক ফাইল ব্যবহার করুন
জেসন

উত্তর:


273

উত্তরযোগ্য তার প্লেবুকগুলিতে 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

জবাবদিহি আসলে সেই পাঠ্যটিকে শীর্ষস্থানীয় স্পেস সহ রেন্ডার করবে, যার অর্থ শেলটি EOFকোনও লাইনের শুরুতে স্ট্রিংটি কখনই খুঁজে পাবে না । আপনি cmdএই জাতীয় প্যারামিটার ব্যবহার করে উত্তরযোগ্যের অসহ্য হিউরিস্টিকস এড়াতে পারবেন :

- 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 লাইন ধারাবাহিকতা উল্লেখ।

উদাহরণ হিসাবে (উত্তরযোগ্য ২.০.০.২. দিয়ে চেষ্টা করা হয়েছে):

---
- 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.4 সহ পুরো এলএস আউটপুট প্রিন্ট করে নি। আপনি উত্তরীয় কোন সংস্করণ ব্যবহার করেছেন?
মার্সেলো রোমানি

লিঙ্কটি মারা গেছে।
কেনারব

এটি ২০১ 2016 সালের, এই জিনিসগুলি ঘটে।
মার্সেলো রোমানি

3

ইওএফ ডিলিমিটারের আগে একটি স্থান যুক্ত করা সিএমডি এড়াতে দেয়:

- shell: |
    cat <<' EOF'
    This is a test.
    EOF
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.