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

3

我有一个YAML文件中的一堆Hashes(用于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中追加这些哈希值。想法是,一个请求到来并触发一个Webhook,运行一个Ruby脚本,添加一个新的Apache VHost和相应的用户。从我所看到的情况来看,Ruby文档在操作YAML方面非常不足,而且谷歌搜索也没有找到任何相关的内容。也许有人可以指点我正确的方向?

1个回答

11

在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文件中的users:下)添加另一个名为new_user的用户条目。同样,主机也可以通过相同的方式添加,一旦您获取了域名和其他信息,就可以像这样添加它们:

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

再次强调,将信息按照正确的层次结构进行排列非常重要。


那差不多就是我现在拥有的,真正让我困扰的是正确操作它的方式,也就是我现在缺失的部分。也就是说,在将内容倒回文件之前,我该如何添加这个新的虚拟主机配置。 - kemra102
好的。您能具体说明新虚拟主机和用户信息的数据格式是什么吗? - limekin
那还没有决定,而我在写它的时候可以选择。我正在考虑通过CLI传递给脚本的多个选项。应该有3个不同的变量,域名、用户名和密码。我不太担心获取数据,更担心如何将其附加到一个或两个哈希表中。 - kemra102
2
不要先读取文件,然后使用 load 解析它,而是使用 load_file 一步读取和解析。另外,不要将哈希序列化到 output 变量中,然后再写入,只需使用 File.write("file.yml", YAML.dump(data)) 即可。创建仅使用一次的中间变量会减慢代码并浪费内存。 - the Tin Man
@theTinMan:感谢您指出这一点。看起来YAML有更多的公共实例方法,比标准API文档中显示的要多(不知道为什么)。我最初只是用ri YAML检查了它,它只给出了YAML.loadYAML.dump,但足以解析和序列化到YAML数据。我同意后面部分,我只是添加它是因为我想要一点清晰度(或强调)关于YAML.dump,因为我正在展示如何使用它。但结果OP已经涵盖了那部分,答案中不需要那部分。 - limekin
YAML 是使用 Psych 或 Sych 实现的,因此您还需要查看它们的文档。 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接