2016-05-18 7 views
1

yamlファイルでこれらのタグを置き換える必要があります。
置き換えられたデータはリストに格納されます。
私は、このYAMLファイルyamlファイルの<TEST>を変更してください。

vagrantfile:  
    target: local 
    vm: 
     provider: 
      local: 
       box: puphpet/ubuntu1404-x<BITS> # MEERKEUZE: 32 OF 64, STANDAARD 64 
       box_url: puphpet/ubuntu1404-x<BITS> # MEERKEUZE: 32 OF 64, STANDAARD 64 
       box_version: '0' 
       chosen_virtualizer: <virtualiser> # MEERKEUZE: virtualbox OF vmware, STANDAARD 64 
       virtualizers: 
        virtualbox: 
         modifyvm: 
          natdnshostresolver1: false 
         showgui: 0 
        vmware: 
         numvcpus: 1 
        parallels: 
         use_linked_clone: 0 
         check_guest_tools: 0 
         update_guest_tools: 0 
       machines: 
        vflm_7orc03npv15g: 
         id: <ID> # STRING 
         hostname: <HOSTNAME> # STRING 
         network: 
          private_network: <IP-ADDRESS> #lOKAAL IP, STANDARAARD 192.168.50.101 
          forwarded_port: 
           hon1d: 
            host: '80' 
            guest: '80' 
         memory: '<MEGABYTES>' # AANTAL, STANDAARD VEELVOUD VAN 1024 
         cpus: '<CORES>' # AANTAL CPUS, STANDAARD AANTAL CORES - 1, NIET HOGER DAN AANTAL CORES 

私はアルにこれらのタグを変更するには何ができるのがありますか?

+0

リストまたは辞書で? – Anthon

+0

** ** https://stackoverflow.com/questions/41620674/use-placeholders-in-yaml – dreftymac

答えて

0

おそらく、pyyamlを使用するのが最も簡単です。例えば。 cpusの値を設定するには:

import yaml 
foo = yaml.load(open('file.yml', 'r')) 
foo['vagrantfile']['vm']['provider']['local']['machines']['vflm_7orc03npv15g']['memory'] = 'bar' 
yaml.dump(foo, open('out.yml', 'w')) 

この方法ではコメントが失われます。

+0

ファイルを反復してタグを置き換えるオプションはありませんか? –

+0

私はpythonを使っているので2.7 –

+0

ああ、私はタグが常に同じになるとは思わなかったと思います。その場合、文字列テンプレート(私は個人的に中括弧と '.format'を使用します)を使ってgipsyのソリューションのようなものに行きます。 – radpotato

0

あなたは自分の置換がに結果の文字列を強制した場合ことを確認するために、YAMLのレベルでこれを行う必要があり、この

template = """vagrantfile:  
    target: local 
    vm: 
     provider: 
      local: 
       box: puphpet/ubuntu1404-x%(BITS)s # MEERKEUZE: 32 OF 64, STANDAARD 64 
       box_url: puphpet/ubuntu1404-x%(BITS)s # MEERKEUZE: 32 OF 64, STANDAARD 64 
       box_version: '0' 
       chosen_virtualizer: %(virtualiser)s # MEERKEUZE: virtualbox OF vmware, STANDAARD 64 
       virtualizers: 
        virtualbox: 
         modifyvm: 
          natdnshostresolver1: false 
         showgui: 0 
        vmware: 
         numvcpus: 1 
        parallels: 
         use_linked_clone: 0 
         check_guest_tools: 0 
         update_guest_tools: 0 
       machines: 
        vflm_7orc03npv15g: 
         id: %(ID)s # STRING 
         hostname: %(OSTNAME)s # STRING 
         network: 
          private_network: %(IP-ADDRESS)s #lOKAAL IP, STANDARAARD 192.168.50.101 
          forwarded_port: 
           hon1d: 
            host: '80' 
            guest: '80' 
         memory: '%(MEGABYTES)s' # AANTAL, STANDAARD VEELVOUD VAN 1024 
         cpus: '%(CORES)s' # AANTAL CPUS, STANDAARD AANTAL CORES - 1, NIET HOGER DAN AANTAL CORES""" 


replaced = template % {"BITS": "some value", "virtualiser": "something", "ID": 2412, "OSTNAME": "OS name", "IP-ADDRESS": "some ip", "MEGABYTES": 100, "CORES": 16} 
+0

これを代入する値によっては、YAMLパーサーが解析できない出力が発生する可能性があります。 – Anthon

0

を達成するための文字列書式テンプレートや使用文字列にYAMLを変換することができますこれは実際に起こると言われています。例えば。あなたの<ID>@abcのようなもので置き換えする必要がある場合、YAMLファイルの実際の行は@として

id: '@abc' 

なく

id: '@abc' 

なる必要が予約されています。そのような警告がいくつかあるので、文字列レベルに置き換えるのは良い考えではありません。

あなたが行うことができます

:あなたを与えるだろう

import sys 
import ruamel.yaml 

yaml_str = """\ 
vagrantfile: 
    target: local 
    vm: 
     provider: 
      local: 
       box: puphpet/ubuntu1404-x<BITS> # MEERKEUZE: 32 OF 64, STANDAARD 64 
       box_url: puphpet/ubuntu1404-x<BITS> # MEERKEUZE: 32 OF 64, STANDAARD 64 
       box_version: '0' 
       chosen_virtualizer: <virtualiser> # MEERKEUZE: virtualbox OF vmware, STANDAARD 64 
       virtualizers: 
        virtualbox: 
         modifyvm: 
          natdnshostresolver1: false 
         showgui: 0 
        vmware: 
         numvcpus: 1 
        parallels: 
         use_linked_clone: 0 
         check_guest_tools: 0 
         update_guest_tools: 0 
       machines: 
        vflm_7orc03npv15g: 
         id: <ID> # STRING 
         hostname: <HOSTNAME> # STRING 
         network: 
          private_network: <IP-ADDRESS> #lOKAAL IP, STANDARAARD 192.168.50.101 
          forwarded_port: 
           hon1d: 
            host: '80' 
            guest: '80' 
         memory: '<MEGABYTES>' # AANTAL, STANDAARD VEELVOUD VAN 1024 
         cpus: '<CORES>' # AANTAL CPUS, STANDAARD AANTAL CORES - 1, NIET HOGER DAN AANTAL CORES 
""" 


def replace(data, values): 
    def do_one(data, values): 
     if isinstance(data, dict): 
      for k in data: 
       data[k] = do_one(data[k], values) 
      return data 
     elif isinstance(data, list): 
      for idx, elem in enumerate(data): 
       data[idx] = do_one(elem, values) 
      return data 
     elif isinstance(data, str): 
      for k in values: # full match 
       if data == k: 
        return values[k] 
      if '<' in data and '>' in data: 
       for k in values: 
        data = data.replace(k, str(values[k])) 
       return data 


    expanded = { ('<' + k + '>'): v for (k, v) in values.iteritems()} 
    do_one(data, expanded) 

data = ruamel.yaml.round_trip_load(yaml_str) 

replace(data, { 
    'BITS': 64, 
    'virtualiser': 'virtualbox', 
    'HOSTNAME': 'localhost', 
    'IP-ADDRESS': '192.168.0.1', 
    'ID': '@abc', 
    'MEGABYTES': 2048, 
    'CORES': 8, 
    }) 

ruamel.yaml.round_trip_dump(data, stream=sys.stdout, indent=4) 

vagrantfile: 
    target: 
    vm: 
     provider: 
      local: 
       box: puphpet/ubuntu1404-x64  # MEERKEUZE: 32 OF 64, STANDAARD 64 
       box_url: puphpet/ubuntu1404-x64  # MEERKEUZE: 32 OF 64, STANDAARD 64 
       box_version: 
       chosen_virtualizer: virtualbox  # MEERKEUZE: virtualbox OF vmware, STANDAARD 64 
       virtualizers: 
        virtualbox: 
         modifyvm: 
          natdnshostresolver1: 
         showgui: 
        vmware: 
         numvcpus: 
        parallels: 
         use_linked_clone: 
         check_guest_tools: 
         update_guest_tools: 
       machines: 
        vflm_7orc03npv15g: 
         id: '@abc' # STRING 
         hostname: localhost # STRING 
         network: 
          private_network: 192.168.0.1 #lOKAAL IP, STANDARAARD 192.168.50.101 
          forwarded_port: 
           hon1d: 
            host: 
            guest: 
         memory: 2048   # AANTAL, STANDAARD VEELVOUD VAN 1024 
         cpus: 8   # AANTAL CPUS, STANDAARD AANTAL CORES - 1, NIET HOGER DAN AANTAL CORES 

ことに注意してください。

  • コメントは
  • を保存しているcpusの値ということと、 memoryは文字列ではなく整数です
  • idの値は、必要に応じて適切に引用されます。

上記は、ruamel.yamlを使用しています。免責事項私はそのパッケージの著者です。 PyYAMLでも同じことができますが、コメントは失われますが、YAML 1.1標準(2005年版)ではなく、YAML 1.1標準(2009年版)ではなくYAML 1.1標準に制限する必要があります。

関連する問題