2015-12-21 7 views
7

हम नमक द्वारा प्रबंधित हमारे minions पर कई पायथन वर्चुअल वातावरण चलाते हैं।साल्टस्टैक: एसएलएस फाइलों के डेटा के लिए गुण (गणना मूल्य)?

प्रणाली के नाम पर इस स्कीमा द्वारा का निर्माण होता है:

project_customer_stage 

उदाहरण:

supercms_favoritcustomer_p 

स्तंभ डेटा:

systems: 
    - customer: favoritcustomer 
    project: supercms 
    stage: p 
    - customer: favoritcustomer 
    project: supercms 
    stage: q 

हर virtualenv के लिए हमारे पास एक linux उपयोगकर्ता । अब तक हम इस तरह "घर" जैसे मानों की गणना करते हैं:

{% for system in pillar.systems %} 
    {% set system_name = system.project + '_' + system.customer + '_' + system.stage %} 
    {% set system_home = '/home/' + system_name %} 
    ... 

लेकिन यह अनावश्यक है।

हम कॉपी + पेस्टिंग {% set system_home = ...%} से कैसे बच सकते हैं?

मैं जिस तरह से वस्तु उन्मुख प्रोग्रामिंग की तरह कर रहा हूँ काम करता है:

  • आप
  • किसी विशेष परिस्थिति में एक अलग घर में निर्देशिका की जरूरत है, तो आप उपवर्ग सकता है घर निर्देशिका के लिए एक संपत्ति निर्धारित कर सकते हैं बेस क्लास और बेस क्लास काम करने के तरीके को ओवरराइट करें।

नमक में आपके पास वाईएएमएल और टेम्पलेटिंग है ... दोनों अच्छी चीजें हैं। लेकिन मेरे मामले में ओओपी अच्छा होगा।

उत्तर

3

आप गतिशील रूप से स्तंभ डेटा भी उत्पन्न कर सकते हैं। एक स्तंभ फ़ाइल के लिए निम्न उदाहरण पर विचार करें: एक systems.yml फ़ाइल से

{% import_yaml "systems.yml" as systems %} 

systems: 
{% for system in systems %} 
{% set name = system['name'] | default(system.project + '_' + system.customer + '_' + system.stage) %} 
{% set home = system['home'] | default('/home/' + name) %} 
    - name: {{ name }} 
    customer: {{ system['customer'] }} 
    project: {{ system['project'] }} 
    stage: {{ system['stage'] }} 
    home: {{ home }} 
{% endfor %} 

इस स्तंभ परिभाषा भार YAML डेटा जिसके लिए नमक अपने pillar_root निर्देशिका में दिखेगा। इस फ़ाइल में ऐसा दिखाई दे सकता है (बहुत अपने प्रारंभिक उदाहरण की तरह):

- customer: smith 
    project: cms 
    stage: p 
- customer: jones 
    project: shop 
    stage: p 
    name: jones_webshop_p # <-- alternate name here! 

ध्यान दें कि यह उदाहरण इस परियोजना का नाम है और उपयोगकर्ता के घर निर्देशिका की तरह गुण गणना करता है गतिशील रूप से, जब तक उन्हें स्पष्ट आपकी डेटा फ़ाइल में परिभाषित कर रहे हैं। इसके लिए, जिन्जा default() filter स्तंभ परिभाषा में उपयोग किया जाता है।

इस स्तंभ परिभाषा का उपयोग करना, आप बस name और home अपने राज्य परिभाषाओं में सीधे स्तंभ डेटा से उपयोग कर सकते हैं:

{% for system in salt['pillar.get']('systems') %} 
{{ system.home }}: 
    file.directory 
{% endfor %} 

इसके अतिरिक्त, मेरी राय में के रूप में इन जिंजा भारी एसएलएस फ़ाइलें पढ़ने के लिए थोड़ा मुश्किल हो, आप अपने स्तंभ फ़ाइल के लिए Python renderer पर स्विच करने पर विचार कर सकते हैं:

#!py 

import yaml 

def run(): 
    systems = [] 
    with open('systems.yml', 'r') as f: 
    data = yaml.safe_load(f) 

    for system in data: 
     if not 'name' in system: 
     system['name'] = "%s_%s_%s" % (system['project'], system['customer'], system['stage']) 

     if not 'home' in system: 
     system['home'] = "/home/%s" % name 

     systems.append(system) 

    return {"systems": systems} 
+0

मैं आपसे सहमत हूं: "ये जिनजा-भारी एसएलएस फाइलें पढ़ने के लिए थोड़ा मुश्किल हो जाती हैं"। मुझे लगता है कि मैं एक अजगर रेंडरर का उपयोग करूंगा। धन्यवाद। – guettli

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