2013-10-28 3 views
13

मैं जोड़ने की कोशिश की:नमक स्टैक का उपयोग करके मैं एकाधिक कमांड कैसे निष्पादित कर सकता हूं?

mypack: 
    pkg: 
    - installed 
    - pkgs: 
     - mercurial 
     - git 
    cmd.run: 
     - name: 'mkdir -p /opt/mypack' 
    cmd.run: 'hg pull -u -R /opt/mypack || hg clone -R /opt https://...' 
    cmd.run: 'ln -s /opt/mypack/etc/init.d/xxx /etc/init.d/xxx' 

लेकिन किसी कारण से इस राज्य को अंजाम/स्थापित करने के लिए लगता है, लेकिन आदेशों निष्पादित नहीं कर रहे हैं, या कम से कम उन सभी को नहीं।

मुझे एकाधिक आदेश चलाने के लिए समाधान की आवश्यकता है और इनमें से कोई भी विफल होने पर तैनाती में विफल रहता है।

मुझे पता है कि मैं एक बैश स्क्रिप्ट लिख सकता हूं और इस बैश स्क्रिप्ट को शामिल कर सकता हूं, लेकिन मैं ऐसे समाधान की तलाश में था जो केवल वाईएएमएल फ़ाइल के साथ काम करेगा।

cmd-test: 
    cmd.run: 
    - name: | 
     mkdir /tmp/foo 
     chown dan /tmp/foo 
     chgrp www-data /tmp/foo 
     chmod 2751 /tmp/foo 
     touch /tmp/foo/bar 

या यह है, जो मैं पसंद करेंगे, जहां स्क्रिप्ट गुरु से डाउनलोड किया जाता है:

+0

संपादित करें: कभी नहीं, जाहिर है कि मैं टिप्पणियों में कोड ब्लॉक पोस्ट नहीं कर सकता। मुझे लगता है कि मैं एक असली जवाब छोड़ दूंगा। – basepi

+1

अरे sorin, क्या इस सवाल का जवाब है? –

+1

एक और साल, एक जवाब स्वीकार करने के लिए सॉरिन के लिए एक और प्रोड। –

उत्तर

43

आप इस चाहते

cmd-test: 
    cmd.script: 
    - source: salt://foo/bar.sh 
    - cwd: /where/to/run 
    - user: fred 
+0

दूसरा संस्करण बेहतर है कि लॉग क्लीनर को समाप्त कर देता है - अन्यथा आउटपुट लॉग में एम्बेडेड स्क्रिप्ट का पूरा पाठ दिखाई देता है (कई पंक्तियों पर जाम होता है)। –

+1

धन्यवाद स्टीवबेनेट। मुझे आशा है कि @ सोरेन एक समाधान के रूप में मेरे जवाब को चिह्नित करेगा। –

+0

मुझे नमक के दस्तावेज़ीकरण में '-नाम: |' का उल्लेख क्यों नहीं मिला? बहुत googleable नहीं, ठीक है। – giorgiosironi

5

आप क्या कर सकते हैं के रूप में दान ने कहा, पाइप का उपयोग कर या cmd.script राज्य। लेकिन यह ध्यान दिया जाना चाहिए कि आपके मूल पोस्ट में कुछ वाक्यविन्यास समस्याएं हैं। प्रत्येक नया राज्य एक name आर्ग की जरूरत है, तो आप न सिर्फ कोलन के बाद आदेश डाल सकते हैं:

mypack: 
    pkg: 
    - installed 
    - pkgs: 
     - mercurial 
     - git 
    cmd.run: 
    - name: 'my first command' 
    cmd.run: 
    - name: 'my second command' 

हालांकि, कि वास्तव में रूप में अच्छी तरह विफल हो सकता है, क्योंकि मुझे नहीं लगता कि आप एक ही राज्य के कई डाल सकते हैं एक आईडी के नीचे। तो अगर आप इस तरह से उन्हें बाहर विभाजित करने के लिए हो सकता है: ऊपर (बेहतर) सुझाव के अलावा

first: 
    cmd.run: 
    - name: 'my first command' 

second: 
    cmd.run: 
    - name: 'my second command' 
+0

दरअसल, आप सही हैं: एक आईडी के रूप में प्रति आईडी प्रति YAML पार्सिंग की अनुमति केवल एक ही कमांड है, इसलिए एक पीकेजी और एक सेमीडी सह-अस्तित्व में हो सकता है, लेकिन दो सेमी नहीं। – Dereckson

8

, तो आप ऐसा कर सकते हैं:

cmd-test: 
    cmd.run: 
    - names: 
     - mkdir -p /opt/mypack 
     - hg pull -u -R /opt/mypack || hg clone -R /opt https://... 
     - ln -s /opt/mypack/etc/init.d/xxx /etc/init.d/xxx 

कारणों मैं अभी तक समझ में नहीं आता के लिए (मैं 'एम साल्ट नौसिखिया), names रिवर्स ऑर्डर में पुनरावृत्त होते हैं, इसलिए कमांड पीछे की ओर निष्पादित होते हैं।

+5

मुझे नहीं लगता कि वे विपरीत क्रम में हैं, सिर्फ एक सूची में वस्तुओं का वास्तविक वाईएएमएल आदेश मनमाने ढंग से है, और आप कभी नहीं जानते कि यह उन्हें कैसे देखेगा –

+0

@TrillScience यह वाईएएमएल नहीं है (सूचियों की गारंटी है आदेश दिया जाना चाहिए) लेकिन 'नाम' विशेष है। यह वास्तव में निर्दिष्ट नामों के लिए व्यक्तिगत cmd.run राज्य उत्पन्न करता है। आप 'नमक-कॉल स्थिति' show_sls --out = yaml जो कुछ भी चलाकर इसे सत्यापित कर सकते हैं। Https://docs.saltstack.com/en/latest/ref/states/highstate.html#names-declaration देखें उल्टा राज्य आदेश एक 'नाम' कार्यान्वयन बग था जो मुझे विश्वास है कि तय किया गया है। – notpeter

संबंधित मुद्दे

 संबंधित मुद्दे