【问题标题】:How to compare yaml files regardless of ordering differences?无论排序差异如何,如何比较 yaml 文件?
【发布时间】:2021-09-29 23:14:33
【问题描述】:

我需要比较从两个不同进程生成并且排序不同的 yaml 文件,并检测它们在 python 中的理想逻辑是否相同。

yaml 文件 1:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

yaml 文件 2:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        ports:
        - containerPort: 80
        image: nginx:1.14.2

在逻辑级别与文字级别生成有用的 yaml 差异的最佳方法是什么?在上面的玩具示例中,这些 yaml 文件应该被认为是等效的。

【问题讨论】:

    标签: python kubernetes yaml


    【解决方案1】:

    我能找到的最佳解决方案是在脚本下面。

    """
    python path_to_dir/compare_yaml.py path_to_dir/file1.yaml path_to_dir/file2.yaml
    """
    import argparse
    import yaml
    import dictdiffer
    
    parser = argparse.ArgumentParser(description='Convert two yaml files to dict and compare equality. Allows comparison of differently ordered keys.')
    parser.add_argument('file_paths', type=str, nargs=2,
                        help='Full paths to yaml documents')
    args = parser.parse_args()
    
    print(f"File Path 1: {args.file_paths[0]}")
    print(f"File Path 2: {args.file_paths[1]}")
    
    with open(args.file_paths[0],'r') as rdr:
        data1=rdr.read()
    
    with open(args.file_paths[1],'r') as rdr:
        data2=rdr.read()
    
    data1_dict = yaml.load(data1,Loader=yaml.FullLoader)
    data2_dict = yaml.load(data2,Loader=yaml.FullLoader)
    
    if data1_dict == data2_dict:
        print("No difference detected")
    else:
        print("Differences detected:")
        for diff in list(dictdiffer.diff(data1_dict, data2_dict)):
            print(diff)
    

    如果按原样运行有问题的示例:

    python .../compare_yaml.py .../yaml1.yaml .../yaml2.yaml
    File Path 1: .../yaml1.yaml
    File Path 2: .../yaml2.yaml
    No difference detected
    

    如果改变一个键,那么得到这样的输出:

    python .../compare_yaml.py .../yaml1.yaml .../yaml2.yaml
    File Path 1: .../yaml1.yaml
    File Path 2: .../yaml2.yaml
    Differences detected:
    ('change', ['spec', 'template', 'spec', 'containers', 0, 'name'], ('nginx', 'ngin'))
    

    【讨论】:

      猜你喜欢
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      相关资源
      最近更新 更多