YAML - подстановка значений для переменных? - PullRequest
4 голосов
/ 30 сентября 2011

рассмотрите следующий yaml

hadoop:  
   storage: '/x/y/z/a/b'
   streaming_jar_path: '/x/c/d/f/r/*.jar'
   commands:  
       mkdir: 'hadoop dfs -mkdir dir'
       copyFromLocal: 'hadoop dfs -copyFromLocal from_path to_path'  
       run: 'hadoop jar $streaming_jar_path -mapper mapper_path -reducer reducer_path -input hdfs_input -output hdfs_output'  

Я хочу заменить значение streaming_jar_path на $streaming_jar_path, как я могу это сделать?

Я знаю, что мы можем merge hashes использовать &(anchors), но здесь я просто хочу изменить одно значение
Прошу прощения, если это тривиальная вещь, я очень плохо знаком с YAML

Спасибо

Ответы [ 3 ]

2 голосов
/ 10 марта 2018

Вы можете реструктурировать свой файл YAML и выполнить с помощью Ansible .

commands.yml:

- hosts: localhost
  vars:
    streaming_jar_path: '/x/c/d/f/r/*.jar'
  tasks:
    - name: mkdir
      shell: "hadoop dfs -mkdir dir"
    - name: copyFromLocal
      shell: "hadoop dfs -copyFromLocal from_path to_path"
    - name: run
      shell: "hadoop jar {{ streaming_jar_path }} -mapper mapper_path -reducer reducer_path -input hdfs_input -output hdfs_output"

Затем просто запустите ansible-playbook для выполнения команд оболочки:

ansible-playbook commands.yml
0 голосов
/ 10 марта 2018

Вот мой способ использования строкового форматера Python ...

файл yaml ...

hadoop:  
   streaming_jar_path: '/x/c/d/f/r/*.jar'
   commands:  
       run: 'hadoop jar {} -mapper mapper_path -reducer reducer_path -input hdfs_input -output hdfs_output'  

код питона:

s_jar_p = params['hadoop']['streaming_jar_path'] 
run_cmd = (params['hadoop']['commands']['run']).format(s_j_p)

Это работает для меня: -)

0 голосов
/ 09 сентября 2013

Это должен быть простой процесс чтения вашего файла, редактирования данных и записи обратно в файл.

import yaml

infile = 'input.yaml'
outfile = 'output.yaml'

#read raw yaml data from file into dict
with open(infile, 'r') as f:
    data = yaml.load(f.read())

#make changes to dict
data['hadoop']['streaming_jar_path'] = '$streaming_jar_path'

#write dict back to yaml file
with open(outfile, 'w') as f:
    f.write(yaml.dump(data))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...