了解然后创建YAML配置文件

时间:2019-06-20 19:29:53

标签: python yaml ruamel.yaml

我正在调查YAML,必须承认,我有点挣扎。我有一个程序可以读取JSON配置文件(并且工作正常),但是我将其重构为与YAML配置文件一起使用,其中一个是我自己的教育,另外两个是对用户更人性化的配置文件。

简而言之,我想有两个键值对,例如

log-file: /var/log/file

api-key: /api/key

,仅定义一次。然后,我希望定义一个主机,并能够在我的配置文件中拥有多个主机。

这是主持人的一个例子。

fqdn: firewall.example.com.
project_id: fluffy-penguin-242411
managed_zone: example
domain: example.com
ttl: 60
interval: 600

这里有人可以帮助我定义一个可以在Python中轻松使用的YAML文件吗?

我已经设法将基本配置添加到我的代码中,但是没有一个与我想要的配置相匹配的配置。

最终,我希望能够有一个可以迭代的主机列表或字典。

干杯

C

更新

我想我可能会走上这样的路

api-key: './ddns-api-key.json'
log-path: './ddns.log'
hosts:
    -   fqdn: 'firewall.example.com.'
        project_id: 'fluffy-penguin-242411'
        managed_zone: 'example'
        domain: 'example.com'
        ttl: 60
        interval: 600

2 个答案:

答案 0 :(得分:2)

您不能完全做到这一点,但是可以通过在列表中使用命名的键/值对对象来完成类似的操作,例如:

api-key: './ddns-api-key.json'
log-path: './ddns.log'
hosts:
    - host1:
        fqdn: 'firewall.example.com.'
        project_id: 'fluffy-penguin-242411'
        managed_zone: 'example'
        domain: 'example.com'
        ttl: 60
        interval: 600
    - host2:
        fqdn: 'stuff.example.org.'
        project_id: 'fluffy-bear-213461'
        managed_zone: 'example'
        domain: 'example.org'
        ttl: 70
        interval: 700

您只需为每个列表条目使用一个唯一的名称-在此示例中,我使用了host1host2等。

答案 1 :(得分:0)

我相信,在以上帖子中,在connectyourcharger的帮助下,我提出了以下建议:

api-key: './ddns-api-key.yaml'
logfile: './ddns.log'
hosts:
    -   host: 'firewall.example.com.'
        project_id: 'fluffy-penguin-242411'
        managed_zone: 'example'
        domain: 'example.com'
        ttl: 60
        interval: 600

    -   host: 'www.example-two.com.'
        project_id: 'fluffy-penguin-242411'
        managed_zone: 'example-two'
        domain: 'example-two.com'
        ttl: 60
        interval: 600

当我使用以下python访问此文件时,我可以遍历YAML主机并检索所有配置项。

import yaml

# Read YAML file
with open("configuration.yaml", 'r') as stream:
    try:
        yaml_data = yaml.safe_load(stream)
    except yaml.YAMLError as exc:
        print(exc)

print(yaml_data['api-key']) # prints ./ddns-api-key.yaml

for host in yaml_data['hosts']:
    print(host['host'])    # prints firewall.example.com and www.exmaple-two.com
    print(host['ttl'])     # prints 60 twice
    print(host['domain'])  # prints example.com and example-two.com

干杯, C