Ansible是一个系列文章,我会尽量以通俗易懂、诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些。

Ansible系列博文直达链接:Ansible入门系列

前言

在学习playbook的时候,你可能会被惊讶到,YAML是什么鬼?我怎么从来都没有接触过!是的,一开始我也是这样的。然后就对这个YAML产生了一个中莫名的恐惧和厌烦感!其实人都是这样的,对陌生的事务,都会有一种抵触感,但是没有办法,为了学习Ansible,只能硬着头皮继续搞了。

YAML简介

YAML就和XML、JSON一样,专门用来写配置文件的语言,非常简洁和强大。

下面就通过一段简单的YAML脚本来感受它的简介与强大:

---
- hosts: server1
user: root
vars:
http_port: 80
max_clients: 200 tasks:
- name: Write apache config file
template: src=/home/test1/httpd.j2 dest=/home/test2/httpd.conf
notify:
- restart apache
- name: Ensure apache is running
service: name=httpd state=started handlers:
- name: restart apache
service: name=httpd state=restarted

我们可以看到,最开始是------它是一个特殊的符号,表示一个文档的开始。接下来的- 代表一个数组项,后面的user: root这种key: value格式,代表一个对象。具体的接下来继续细说!

从上面的一小段代码,可以看到它的基本语法规则超级简单:

  • 大小写敏感;
  • 使用缩进表示层级关系;
  • 缩进时不允许使用Tab键,只允许使用空格;
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可;
  • #表示注释,只支持单行注释,不支持多行注释。

说完语法规则,再来看它支持的数据结构:

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary);
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list);
  • 标量(scalars):单个的、不可再分的值

再复杂的YAML脚本,基本上也都是上述这三种数据结构组成的。所以,掌握了这三种结构,剩下的就是语法糖了。下面就分别对这三种语法结构展开说明。

对象

对象的一组键值对,使用冒号结构表示,格式为key: value(冒号后面一定要记住加一个空格)。

key: value

也可以使用缩进表示层级关系:

vars:
http_port: 80
max_clients: 200

YAML也允许另一种写法,将所有键值对写成一个行内对象。比如这样:

vars: {http_port: 80, max_clients: 200}

数组

使用- 代表一个数组项,比如可以这样子定义一个数组:

- 192.168.1.2
- 192.168.1.3
- 192.168.1.4

如果数据结构的子成员是一个数组,则可以在该项下面缩进一个空格,比如这样:

-
- 192.168.1.2
- 192.168.1.3
- 192.168.1.4

数组也可以采用行内表示法,就像这样子:

- servers: [192.168.1.2, 192.168.1.3, 192.168.1.4]

标量

YAML中提供了以下常量结构:

  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间
  • 日期
---
boolean:
- TRUE # true,True都可以
- FALSE # false,False都可以
float:
- 3.14
- 6.8523015e+5 # 可以使用科学计数法
int:
- 123 # 整数
null:
nodeName: 'node'
parent: ~ # 使用~表示null
string:
- 哈哈
- 'Hello world' # 可以使用双引号或者单引号包裹特殊字符
- newline
newline2 # 字符串可以拆成多行,每一行会被转化成一个空格
date:
- 2018-02-17 # 日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00 # 时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区

复合结构&特殊语法

在YAML中,任何一个复杂的脚本文件都是上面的这三种数据结构再加上一些语法组成的。如果手里有一个复杂的YAML脚本,挠破头皮都看不懂,没关系,我们可以将看不懂的YAML通过工具转成我们可以看懂的JSON格式。

对于还有一些特殊的语法,比如引用、锚点、别名等,这些特殊语法,我们在遇到的时候,再去查询资料即可!这里不做详细的总结!

总结

说实话,我一开始对YAML这种结构并不感冒,感觉是一种奇葩的语法结构,如果不是为了学习Ansible,我想我是不会主动去学习它的,即使我已经学会了它,但是我还是保留我的看法,它真的是一种奇葩的语法结构,不只是我一个人是这样认为的,好多人都是这么看的!你觉的呢?

外面大雨,好冷!

果冻想,认真玩技术的地方。

2019年10月3日,于内蒙古呼和浩特。

YAML语法入门的更多相关文章

  1. [转帖] YAML 快速入门

    https://www.jianshu.com/p/97222440cd08 原始文档更加易读. YAML快速入门 叩丁狼教育 关注 2018.02.18 19:19* 字数 1776 阅读 876评 ...

  2. YAML文件格式入门

    YAML快速入门 https://www.jianshu.com/p/97222440cd08 https://yaml.org/spec/1.2/spec.pdf http://nodeca.git ...

  3. YAML 语法

    YAML 语法 来源:yaml 这个页面提供一个正确的 YAML 语法的基本概述, 它被用来描述一个 playbooks(我们的配置管理语言). 我们使用 YAML 是因为它像 XML 或 JSON ...

  4. [独孤九剑]持续集成实践(二)– MSBuild语法入门

    本系列文章包含: [独孤九剑]持续集成实践(一)- 引子 [独孤九剑]持续集成实践(二)– MSBuild语法入门 [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBu ...

  5. saltstack实战3--配置管理之YAML语法

    本文来自如下链接http://docs.saltstack.cn/topics/yaml/index.html 了解YAML 默认的SLS文件的renderer是YAML renderer.YAML是 ...

  6. Java基础语法入门01

    Java基础语法入门01 学习java你要先进行去了解JDK,JRE,JVM JDK Java开发工具包 JRE Java语言开发的运行环境 JVM Java虚拟机,用于Java语言的跨平台所用. 当 ...

  7. 【转】.MD语法入门

    @2019-02-13 [小记] .MD语法入门

  8. Markdown之语法入门篇

    Markdown语法入门 一.什么是Markdown语言 我相信有很多小伙伴没有听说过Markdown语言.的确,对于一般人来说,有word足够了.但是有这么一群人,受够了word那糟糕的排版方式,需 ...

  9. ansible yaml 语法

    yet another markup language -- 另外的一种标记语言 yaml 语法: 序列:同一个类型的数据有多个,用"-" 来区分,叫序列 映射:价值对,用&quo ...

  10. 【K8S】K8S-网络模型、POD/RC/SVC YAML 语法官方文档

    K8S-网络模型.POD/RC/SVC YAML 语法官方文档 Kubernetes - Production-Grade Container Orchestration kubernetes/kub ...

随机推荐

  1. 如何计算DG环境下Redo传输所需的带宽?

    MOS有篇文章: How To Calculate The Required Network Bandwidth Transfer Of Redo In Data Guard Environments ...

  2. 移位寄存器的设计(VHDL)及testbench的编写

    移位寄存器是一种常用的存储元件,此处由D触发器构成,如下图所示. 当时钟边沿到来时,存储在移位寄存器的数据朝一个方向移动一个BIT位. 移位寄存器的功能主要为:串并转换,并串转换和同步延迟. vhdl ...

  3. NC216012 Let'sPlayCurling

    题目链接 题目 题目描述 Curling is a sport in which players slide stones on a sheet of ice toward a target area ...

  4. RDM6300 125KHz ID卡读卡器

    RDM6300 RDM6300是一个针对125KHz ID卡的读卡模块, 用于读取EM4100兼容ID卡信息, 由一片C8051F330和一片LM358D双运放组成 注: EM4100, 4200卡是 ...

  5. VuePress + Github Pages 搭建文档博客

    说明 最近想把常用的一些干货知识点都集中起来,方便发布和查找.相当于创建一个自己的知识库,我就叫它Java技术文档.虽然博客写文档也挺方便,但是在于文档的集中阅读和管理方面还是不够简洁和快速.此处就以 ...

  6. SpringBoot+Shiro+LayUI权限管理系统项目-6.实现角色管理

    1.说明 只讲解关键部分,详细看源码,文章下方捐赠或QQ联系捐赠获取. 2.功能展示 3.业务模型 @Data @EqualsAndHashCode(callSuper = false) @Acces ...

  7. Golang gRPC学习(05): retry重试

    什么是重试 如果服务出现了错误,主要是网络,服务器出现了短暂异常的时候,该怎么办? 我们都会人工或者自动的重新连接服务试试,看服务是否恢复可用了. 这种重新进行连接服务的一种方式就是重试.如果是在微服 ...

  8. android:加载PDF几种方法汇总对比

    在安卓项目中,加载PDF文件,是一个比较常见的需求.又分为两大类, 1.加载网络PDF 2.加载一个本地静态PDF. 查阅资料,纵观网上在安卓中打开PDF的各种方式,大致可以分为以下几类, 1.直接使 ...

  9. SVN培训笔记(下拉项目、同步修改、添加文件、修改文件、删除文件、改名文件等)

    前言   为了方便新加入团队的员工熟悉团队协作开发.  为了将好东西整理分享给有需要的网友.  将SVN内部员工培训文档公开,以方便更多的人,提高知识获取速度,尽快熟悉协同开发.  本文档培训员工对于 ...

  10. c# rdkafka 设置偏移量(offset)

    参考资料: librdkafka: 如何设置Kafka消费者订阅消息的起始偏移位置 领导要求kafka消费者端消费最新的数据. 不知道怎么设置偏移量,查了资料. 用惯了封装好的东西,都不知道怎么设置了 ...