如何使用Ruby向YAML哈希添加值

时间:2015-03-03 13:48:01

标签: ruby hash yaml webhooks hiera

我在YAML文件中有一堆哈希(对于某些服务器的基于Puppet / Hiera的配置),看起来像这样:

---
apache_vhosts:
  'webuser.co.uk':
    ip: '*'
    port: '80'
    serveraliases: ['www.webuser.co.uk',]
    add_listen: false
    docroot: '/home/webuser/public_html'
    docroot_owner: 'webuser'
    docroot_group: 'apache'
    serveradmin: 'webmaster@webuser.co.uk'
    scriptalias: '/home/webuser/public_html/cgi-bin/'
    access_log_format: '\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"'
    override: 'all'
users:
  'webuser':
    ensure: 'present'
    gid: '500'
    managehome: true
    home: '/home/webuser'
    password: '$6$zix5AzRheEzQwadthjvLNh.8maO6o4DU4Y0POTaS6xfgjfdvihP2O/UQN6eVDHjG2hTCT6VTLk5HsXeB9FF0xMlYiYY9W1'
    password_max_age: '99999'
    password_min_age: '0'
    shell: '/sbin/nologin'
    uid: '500'

我需要以自动方式在Ruby中附加这些哈希值。这个想法是一个请求进来并命中一个运行ruby脚本的webhook,该脚本添加了一个新的Apache VHost和随附的用户。从操作YAML的角度来看,Ruby文档非常不合适,谷歌搜索没有提出任何相关的东西。也许有人可以指出我正确的方向?

1 个答案:

答案 0 :(得分:8)

在Ruby中使用YAML并不多。我认为您只需要知道两种方法:YAML.loadYAML.dump

假设文件是​​file.yml,其中包含您提供的内容:

# YAML is part of the standard library.
require 'yaml'

# YAML.load parses a YAML string to appropriate Ruby objects.
# So you can first load the contents of the file with File#read,
# then parse it.
yaml_string = File.read "file.yml"
data = YAML.load yaml_string

# Now you have all of it in data.
data["apache_vhosts"]
# => {"webuser.co.uk"=>{"ip"=>"*", ... 

# Once you are done manipulating them, dump it back with YAML.dump
# to convert it back to YAML.
output = YAML.dump data
File.write("file.yml", output)

我认为这就是它。

<强>更新

好的,现在它实际上是附加已解析的数据。通过解析,我的意思是解析的数据格式应该与现有格式一致。

假设您有一个名为new_user的新用户的有效解析信息:

new_user_info = {"ensure"=>"present", "gid"=>"900", "managehome"=>true, "home"=>"/home/new_user"}

要将其附加到原始YAML内容(解析为ruby对象),您可以这样做:

data["users"]["new_user"] = new_user_info

转储后,这将在用户列表底部(在YAML文件的new_user下)添加另一个名为users:的用户条目。主机也可以以相同的方式添加,一旦获得域名和其他信息,您可以像这样添加它们:

data["apache_vhosts"]["new_domain_name"] = info

同样重要的是将信息安排在正确的层次结构中。