对不起,这是一个基本类型的问题。刚从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_list
和friends_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序列 |