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

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

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

很抱歉第二个例子,我知道它在Ansible中不起作用。。这只是为了传达语法。

随着安西布尔的方式,回到YAML的问题。

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

何时使用"列表"将取决于将解析内容的应用程序/软件。示例任务ansible和容器Kubernetes中的密钥名称需要包含"list"。下一行的"主题"后面必须是一个"-"。

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

下一步;Key:value可以包含其他Key:value或";"列表";,对于";列表";。但不能在同一水平上拥有";key:值;以及";列表";混合。实例创建具有2个关键字的关键字1:value和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为重复的keyname提供了差异结果。我认为限制性更强的是"更"正确的。

不确定我是否遗漏了任何一点或/或存在误解。这对开发者来说可能是非常清楚的。

首先,很明显,您在这里编写的是Ansible剧本,因此您实际想要的版本是第一个版本。从Ansible的角度来看,第二个版本是无效的(尽管它的YAML语法有效)。

现在,抛开这些,我将解释这种YAML语法是如何工作的。

让我们通过参考YAML语言规范来分解这种区别。

第1章简介:


有各种各样的数据结构,但它们都可以用三个基本基元表示:映射(散列/字典)、序列(数组/列表)和标量(字符串/数字)。

3.2.1.1.节点


YAML节点表示单个本地数据结构。此类节点具有三种内容之一:标量、序列或映射。

因此,本质上,YAML中有三个核心结构:

  • 标量,最原始的单位
  • 序列,本质上是列表或数组
  • 映射,是键值对

在YAML中,当您使用-时,您会说接下来发生的事情都是序列(列表)的一部分。当你使用CCD_ 5时,你所说的是左边的东西是一个";键";右边的是一个";值";(并且它们一起形成"键值对")。

但事情比这更复杂,因为当然,你可以嵌套这些结构。

让我们举一个简单的例子:

---
my_shopping_list:
- apples
- eggs
- oranges

friends_shopping_list:
- chocolate
- beer
- bacon

在这个例子中,我们有一个映射-有两个键(my_shopping_listfriends_shopping_list),每个键都有一个相应的值。在这种情况下,值是序列(列表)--两个朋友的购物列表

在YAML中,您还可以使用许多编程语言中更常见的数组表示法来编写序列。因此,以下内容与上述内容等效:

---
my_shopping_list:
[apples, eggs, oranges]

friends_shopping_list:
[chocolate, beer, bacon]

事情也可以反过来——我们可以有一个由映射组成的序列。事实上,这正是你的剧本例子。让我们深入研究一下。

---
- 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') }}"

在Ansible中,剧本由系列的剧本组成。在您的示例中,有一个播放(您在此处看到的整个内容构成一个播放)。

在一个剧本中,我们有一个映射(键值对)。在本例中,这些是:

名称"向主机添加密钥";(标量)
主机"所有";(标量)
任务YAML序列

相关内容

  • 没有找到相关文章

最新更新