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. P10033 题解

    不喜欢特判?不喜欢分讨?不喜欢被卡 corner?不喜欢证明?不喜欢动脑子? 那就看这篇题解! 感性思路 首先感性地感受一下题目宽泛的限制条件题解区各种花式的构造方法就不难想出,符合条件的序列实在很多 ...

  2. 8.类--《Python编程:从入门到实践》

    8.1 创建类 根据约定,在Python中,首字母大写的名称指的是类. 这个类定义中的括号是空的,因为我们要从空白创建这个类.在Python 2.7中创建类时,需要做细微的修改--在括号内包含单词ob ...

  3. npm script 详解,tsc && electron . 直接编译后 运行,非常方便

    最终平时只需要用这个方法就可以了: tsc && electron . ======================================================== ...

  4. wmctf的题解&blindless&exit_hook

    0x00 好久不见 2023.8.25 夜里 wmctf2023也是一个收获很大的比赛.只做了一个blindless,但是体会到了无泄露做出题来的奥妙.踩过的坑(学到的东西)包括但不限于 调试要用do ...

  5. NC16615 [NOIP2008]传纸条

    题目链接 题目 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接 ...

  6. Ubuntu20.04下的ESP8266环境

    硬件说明 ESP8266使用的是3.3V供电, 和Arduino不一样, ESP8266的I/O脚是不能防5V的, 连上就烧. 其输出只有12mA, 而Arduino是20-40mA. ESP8266 ...

  7. 【Android】使用AIDL实现进程间传递对象案例

    1 前言 ​ 在 Android--使用AIDL实现进程间通讯简单案例 中介绍了使用 AIDL 在进程间传递字符串,对于8种基本数据类型( byte.short.int.long.float.doub ...

  8. let与const

    let与const ES2015(ES6)新增加了两个重要的JavaScript关键字: let和const. 块级作用域 代码块内如果存在let或者const,代码块会对这些命令声明的变量从块的开始 ...

  9. 300ms点击延迟

    300ms点击延迟 移动端的300ms点击延迟是因为移动端可以进行双击缩放的操作,因此浏览器在click之后要等待300ms,看用户有没有下一次点击,也就是判断这次操作是单击还是双击.如果通过监听to ...

  10. Oracle 分析函数详解(Analytic Functions)--概念部分

    一.概念介绍: Analytic functions compute an aggregate value based on a group of rows. They differ from agg ...