首页 > 解决方案 > Yaml列表和对象的区别,以及它们的用法

问题描述

对不起,一个基本类型的问题。刚开始使用 YAML .. -list: 和 object: 有什么区别?

https://jsonformatter.org/yaml-validator,两个 YAML 都经过验证。即使所有的“-”都被删除了。谢谢!

---

- name: Add Keys to Hosts
  hosts: all
  tasks:
  - name: Install Key
    authorized_key:
      user: root
      state: present
      key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"

---
- name: Add Keys to Hosts
  hosts: all
- tasks:
  - name: Install Key
    authorized_key:
      user: root
      state: present
      key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
    name2: Install Key
    authorized_keys:
        - name: test
        - name: Apple

标签: typesyaml

解决方案


谢谢哥斯达黎加!我的问题不是关于 ansible,而是关于 YAML。为我的语法道歉。而且我不是开发人员。刚开始使用 Ansible 并试图将控制节点的 ssh 密钥导入某些主机,但我作弊了……for i in {200..250}; do ssh-keyscan -H 192.168.101.$i >> ~/.ssh/known_hosts ; done在运行该 Ansible 剧本之前使用过。我知道这个特别的一行只是附加,它错过了检查和更新known_hosts、记录和总结结果的代码,我应该能够通过 Ansible 轻松实现。如果我知道如何使用 Ansible。

通过测试ansible all -m command -a "df -h"

对第二个示例感到抱歉,我知道它在 Ansible 中不起作用。它只是为了传达语法。

解决了 Ansible 问题,回到 YAML 问题。

经过测试,我对“列表”的理解是一组条目/项目(条目是键/值对或简单值)。或“列表”中的单个项目。分组也可以通过键值对的嵌套来实现。

何时使用“列表”取决于解析内容的应用程序/软件。例子; ansible 和容器中的任务键名Kubernetes 需要包含“列表”。下一行中的“keyname:”后面必须是“-”。

差异(至少在 YAML 中);“列表”可以包含具有相同键名的项目。并且可能在“列表”中存在项目的顺序或位置。键名不允许重复键名:不在“列表”中的值对。“列表”是可以重复的项目的索引顺序,而同一级别(缩进)的键:值对就像文件夹中的文件,没有重复的文件名。使用嵌套的键:值对创建“列表”是可能的,但是创建文件夹 1、文件夹 2 等很麻烦。以分隔相同的文件名文件,并且不容易在其间插入另一个项目。可能的“列表”内置了自动位置索引。

下一个; Key:value 可以包含其他 key:value 或“list”,“list”也是如此。但不能在同一级别中混合使用“key:value”和“list”。例子; 使用 2 个 key:value 创建 key1 和 1 个带有 2 个项目(key4 和 [key5,key6])的“列表”。

Key1: 
   key2: Covid
   key3: CFR
-  key4: systemctl
-  key5: motd
   key6: dig

另一个是;

Key1:     
  - key1: XX     
    key2: XX
    key3: XX
  - key1: xx      # OK, same key name
    key2: xx    
    key2: XX      # Not OK!, same as key name above

我使用https://onlineyamltools.com/validate-yaml进行测试,但https://codebeautify.org/yaml-validator提供了重复键名的差异结果。我认为更严格的那个是“更多”正确的。

不确定我错过了任何一点或/并且存在误解。这对开发人员来说可能是非常清楚的。


推荐阅读